实现服务端接收多个客户端的消息_(重点)

如何实现服务端接收多个客户端的消息

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()+"下线了");
}
}
}

posted on 2022-04-01 19:51  我要当程序源  阅读(282)  评论(0编辑  收藏  举报

导航