Socket(二)尝试多线程的服务端

简介:    上次的服务端一次只能跟一个客户端连接。下午决定结合前面学习的线程的知识,更改一下,改成多线程的服务端。   这里只是简单的尝试。等我学的知识增加了,会写出更好的来的。   服务端代码:   Code: package Socket;   /**   ...

   上次的服务端一次只能跟一个客户端连接。下午决定结合前面学习的线程的知识,更改一下,改成多线程的服务端。

  这里只是简单的尝试。等我学的知识增加了,会写出更好的来的。

  服务端代码:

 

Code:
  1. package Socket;  
  2. /**  
  3.  * @author Geek_Soledad  
  4.  * @creation date 2011-4-24 上午08:22:39  
  5.  *  
  6.  */  
  7. import java.io.*;  
  8. import java.net.*;  
  9.   
  10. public class TCPServer implements Runnable{  
  11.     ServerSocket ss;  
  12.     Socket s;  
  13.     public static void main( String[] args) {  
  14.         TCPServer tcpServer = new TCPServer();  
  15.         try {  
  16.             tcpServer.ss = new ServerSocket(10086); // Server start  
  17.             while (true) {  
  18.                 tcpServer.s = tcpServer.ss.accept(); // waiting for connection  
  19.                 new Thread(tcpServer).start();  
  20.             }  
  21.         } catch (IOException e) {  
  22.             // TODO Auto-generated catch block  
  23.             e.printStackTrace();  
  24.         }  
  25.     }  
  26.     @Override  
  27.     public void run() {  
  28.         // TODO Auto-generated method stub  
  29.         message();  
  30.     }  
  31.     void message() {  
  32.         String name;  
  33.         DataInputStream dis;  
  34.   
  35.         try {  
  36.             dis = new DataInputStream(s.getInputStream());  
  37.             name = dis.readUTF();  
  38.             System.out.println(name + "已连接!");  
  39.               
  40.             String is = dis.readUTF();  
  41.               
  42.             while("exit".equalsIgnoreCase(is) == false) {  
  43.                 System.out.println(name+":"+is);  
  44.                 is = dis.readUTF();  
  45.             }  
  46.               
  47.             dis.close();  
  48.             s.close();  
  49.             System.out.println(name + "已退出");  
  50.         } catch (IOException e) {  
  51.             // TODO Auto-generated catch block  
  52.             e.printStackTrace();  
  53.         }  
  54.     }  
  55. }  

 

  运行客户端时,第一个参数指定了客户端的名字。代码如下:

Code:
  1. package Socket;  
  2. /**  
  3.  * @author Geek_Soledad  
  4.  * @creation date 2011-4-24 上午08:30:47  
  5.  *  
  6.  */  
  7. import java.io.*;  
  8. import java.net.*;  
  9.   
  10. public class TCPClient {  
  11.     String name = "noname";  
  12.     public static void main( String[] args) {  
  13.         TCPClient client = new TCPClient();  
  14.         if (args.length>0) {  
  15.             client.name = args[0];  
  16.         }  
  17.         client.connection();  
  18.   
  19.     }  
  20.       
  21.     void connection(){  
  22.         try {  
  23.             Socket s = new Socket("127.0.0.1"10086);  
  24.             System.out.println("成功连上服务端");  
  25.             DataOutputStream dos = new DataOutputStream(  
  26.                     s.getOutputStream());  
  27.             BufferedReader bf = new BufferedReader(  
  28.                     new InputStreamReader(System.in));  
  29.             String words ;  
  30.               
  31.             // 发送出客户端名字  
  32.   
  33.             dos.writeUTF(name);  
  34.   
  35.             // 开始通信  
  36.             do {  
  37.                 words = bf.readLine();  
  38.                 dos.writeUTF(words);  
  39.             } while("exit".equalsIgnoreCase(words) == false);  
  40.               
  41.             s.close();  
  42.         } catch (UnknownHostException e) {  
  43.             // TODO Auto-generated catch block  
  44.             e.printStackTrace();  
  45.             System.out.println("服务器IP错误");  
  46.         } catch (IOException e) {  
  47.             // TODO Auto-generated catch block  
  48.             e.printStackTrace();  
  49.             System.out.println("无法连接主机");  
  50.         }  
  51.     }  
  52. }  

  刚才发客户端的代码时,又对它改了一下,把连接部分放到函数connection中。

 

  刚才又尝试了一下,在其中一个客户端退出时有时会出现s.close()被调用,导致另一个客户端断开,不知是什么原因。可能我对多线程还得再学习学习。

目录
相关文章
|
8月前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
8月前
|
Java
Socket网络编程练习题五:客户端多用户上传文件(多线程版)并使用线程池管理线程
Socket网络编程练习题五:客户端多用户上传文件(多线程版)并使用线程池管理线程
|
7月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
117 0
|
7月前
|
缓存 网络协议 Linux
c++实战篇(三) ——对socket通讯服务端与客户端的封装
c++实战篇(三) ——对socket通讯服务端与客户端的封装
160 0
|
4月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
4月前
|
C语言
C语言 网络编程(九)并发的UDP服务端 以线程完成功能
这是一个基于UDP协议的客户端和服务端程序,其中服务端采用多线程并发处理客户端请求。客户端通过UDP向服务端发送登录请求,并根据登录结果与服务端的新子线程进行后续交互。服务端在主线程中接收客户端请求并创建新线程处理登录验证及后续通信,子线程创建新的套接字并与客户端进行数据交换。该程序展示了如何利用线程和UDP实现简单的并发服务器架构。
|
6月前
|
Java
如何在Java中实现多线程的Socket服务器?
在Java中,多线程Socket服务器能同时处理多个客户端连接以提升并发性能。示例代码展示了如何创建此类服务器:监听指定端口,并为每个新连接启动一个`ClientHandler`线程进行通信处理。使用线程池管理这些线程,提高了效率。`ClientHandler`读取客户端消息并响应,支持简单的文本交互,如发送欢迎信息及处理退出命令。
|
7月前
|
Java
java使用多线程编写服务端与客户端文件上传程序
java使用多线程编写服务端与客户端文件上传程序
|
7月前
|
Java
java使用ServerSocket和Socket实现客户端与服务端通讯
java使用ServerSocket和Socket实现客户端与服务端通讯
|
8月前
|
监控 网络协议 iOS开发
程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案
程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案
263 0