功能演示
【基于TCP的Socket聊天Demo】 https://www.bilibili.com/video/BV1yd4y1r7tJ/?share_source=copy_web&vd_source=603d76094f4b03d34ae4f468d5e77227

实现原理
每个客户端为其新建一个服务端线程, 一个客户端对应一个服务端线程。
私发: 通过服务端转发到目标客户端
群发:通过服务端向所有客户端转发
代码
客户端
| import java.io.IOException; |
| import java.io.PrintWriter; |
| import java.net.Socket; |
| import java.util.Scanner; |
| |
| |
| |
| |
| |
| |
| public class Client1 { |
| public static void main(String[] args) { |
| |
| try { |
| Socket socket = new Socket("localhost", 8888); |
| System.out.println(socket); |
| |
| new Thread(new ClientThread(socket)).start(); |
| |
| |
| PrintWriter out = new PrintWriter(socket.getOutputStream(), true); |
| |
| Scanner scanner = new Scanner(System.in); |
| while (true) { |
| |
| String message = scanner.nextLine(); |
| out.println(message); |
| } |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| } |
| } |
读消息线程
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.net.Socket; |
| |
| |
| |
| |
| |
| |
| public class ClientThread implements Runnable { |
| Socket socket; |
| |
| public ClientThread(Socket socket) { |
| this.socket = socket; |
| } |
| |
| @Override |
| public void run() { |
| boolean isExit = true; |
| while (isExit) { |
| try { |
| readMessage(); |
| } catch (Exception e) { |
| System.out.println("服务器断开连接"); |
| isExit = false; |
| System.exit(-1); |
| } |
| } |
| } |
| |
| |
| |
| |
| private void readMessage() throws IOException { |
| BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); |
| System.out.println("\n正在等待返回消息... "); |
| String message = in.readLine(); |
| System.out.println(message); |
| } |
| |
| } |
服务端
| import java.io.IOException; |
| import java.net.ServerSocket; |
| import java.net.Socket; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| |
| |
| |
| |
| |
| public class RunServer { |
| public static Map<Socket, String> map = new HashMap<>(); |
| |
| public static void main(String[] args) { |
| ServerSocket serverSocket = null; |
| Socket socket = null; |
| try { |
| serverSocket = new ServerSocket(8888); |
| System.out.println("服务端已启动, 等待连接..."); |
| int num = 0; |
| while (true) { |
| socket = serverSocket.accept(); |
| map.put(socket, null); |
| System.out.println(socket+"已连接, "+(++num)+"号用户"); |
| new Thread(new ServerThread(socket)).start(); |
| } |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| |
| } |
| } |
服务端线程
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.io.PrintWriter; |
| import java.net.Socket; |
| |
| |
| |
| |
| |
| |
| public class ServerThread implements Runnable { |
| private Socket socket; |
| |
| public ServerThread(Socket socket) { |
| this.socket = socket; |
| } |
| |
| @Override |
| public void run() { |
| while (true) { |
| send(); |
| } |
| } |
| |
| private void send() { |
| try { |
| BufferedReader in = null; |
| PrintWriter out = null; |
| in = new BufferedReader(new InputStreamReader(socket.getInputStream())); |
| |
| String mes = null; |
| try { |
| mes = in.readLine(); |
| } catch (IOException e) { |
| System.out.println("客户端异常关闭"); |
| e.printStackTrace(); |
| System.exit(-1); |
| } |
| |
| String to = null; |
| if (mes.length() > 5) { |
| to = mes.substring(0, 5); |
| |
| |
| for (Socket socket1 : RunServer.map.keySet()) { |
| if (to.equals(String.valueOf(socket1.getPort()))) { |
| out = new PrintWriter(socket1.getOutputStream(), true); |
| out.println(mes.substring(5)); |
| return; |
| } |
| } |
| } |
| |
| |
| |
| String message = "【群发消息】" + socket.getPort() + ":" + mes; |
| System.out.println(message); |
| |
| for (Socket socket1 : RunServer.map.keySet()) { |
| |
| if (socket1 == this.socket) continue; |
| out = new PrintWriter(socket1.getOutputStream(), true); |
| out.println(message); |
| } |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| |
| } |
| |
| |
| } |
如何同时运行多个客户端?


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能