Java之多人聊天室
基于TCP协议书写的服务端,服务端开启之后,只能给一个客户端提供服务,在服务结束之后,服务端就关闭了,其他的客户端就无法在连接到当前这个服务端。
解决一个服务端,可以同时(并发)给多个客户端提供服务:
我们需要在服务端开启多线程,只要有一个客户端连接到服务端,那么这是服务端内部就应该开启一个线程,为这个客户端服务,然后服务端继续等待下一个客户端的连接,只要有客户端连接到服务端,服务端就需要开启线程为当前连接到的这个客户端进行服务。
开启线程:直接new Thread 调用start,获取使用线程池都可以完成。
线程的任务:在服务端获取到客户端对象之后,后续的所有操作,都是基于当前这个客户端而进行,那么当前这些操作都属于线程的任务。
服务端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; //聊天室服务器端 public class Server { //存放所有链接上当前服务器的客户端 private List<Socket> clientSockets= new ArrayList<Socket>(); public Server() { try { //1.创建服务器端socket ServerSocket serverSocket= new ServerSocket( 9999 ); while ( true ) { //2.接收客户端的socket Socket socket= serverSocket.accept(); //3.存入集合中 this .clientSockets.add(socket); //4.开一个线程处理客户端发送过来的消息 ReceiveThread thread= new ReceiveThread(socket); thread.start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //创建一个线程 接收客户端的socket class ReceiveThread extends Thread { private Socket currentSocket; public ReceiveThread(Socket socket) { this .currentSocket=socket; } public void run() { try { //获得当前客户端中拿到的消息 InputStream is= this .currentSocket.getInputStream(); //获得输入流 BufferedReader bufferedReader= new BufferedReader( new InputStreamReader(is)); String msg= null ; while ((msg=bufferedReader.readLine())!= null ) { //群发给所有的客户端 for (Socket socket :clientSockets) { PrintWriter pw = new PrintWriter( new OutputStreamWriter(socket.getOutputStream())); pw.println(msg); pw.flush(); //发送到客户端 //不要关闭输出流 ftp协议中 规定 如果关闭当前socket输出流 则意味着对应的socket关闭 } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } |
客户端
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)