实现服务端接收多个客户端的消息_(重点)
如何实现服务端接收多个客户端的消息
1.主线程定义了循环负责接收客户端Socket管道连接
2.每接收到一个Socket通信管道后分配一个独立的线程负责处理它。
客户端
public class ClientDemo1 {
public static void main(String[] args) {
try {
//1. 创建Socket通信管道请求有服务端的链接
//public Socket(String host, int port)
//参数一:服务端的IP地址
//参数二:服务端的端口
Socket socket = new Socket("127.0.0.1",9999);
//2.从socket通信管道中得到一个字节输出流, 负责发送数据
OutputStream os = socket.getOutputStream();
//3.把低级的字节流包装成打印流
PrintStream printStream = new PrintStream(os);
Scanner sc = new Scanner(System.in);
//4.发送消息
while(true){
System.out.println("请说:");
String rs = sc.nextLine();
printStream.println(rs);
printStream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
===
服务端
public class ServerDemo2 {
public static void main(String[] args) {
try {
//1.注册端口
ServerSocket serverSocket = new ServerSocket(9999);
//a.定义一个死循环由主线程负责,不断地接受客户端的Socket管道的连接
while (true) {
//每接收到一个客户端的Socket管道, 交给一个独立的子线程负责读取消息
Socket socket = serverSocket.accept();
System.out.println(socket.getRemoteSocketAddress()+"上线了");
new ServerReader(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
===
线程
class ServerReader extends Thread{
private Socket sk;
public ServerReader(Socket sk) {
this.sk = sk;
}
@Override
public void run() {
try {
InputStream is = sk.getInputStream();
//4.把字节输入流包装成缓冲字符输入流进行消息的接收
InputStreamReader inputStreamReader = new InputStreamReader(is);//转换流(将字节输入流转换成字符输入流)
BufferedReader br = new BufferedReader(inputStreamReader);
//按行读取消息
String rs;
while ((rs = br.readLine()) != null){
System.out.println(sk.getRemoteSocketAddress()+"说了"+rs);
}
} catch (IOException e) {
System.out.println(sk.getRemoteSocketAddress()+"下线了");
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!