1.首先,一个服务端线程是无法监控多个客户端连接的,故要用到线程池
一.编辑服务端监控客户端连接的类
package com.fitk.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ServerRunner extends Thread {
private Socket socket;
public ServerRunner(Socket socket){
this.socket = socket;
}
@Override
public void run() {
// 获取输入流和输出流 输入流和输出流是通过socket对象来进行数据传输的。
BufferedReader in = null;
PrintWriter out =null;
String message ="";
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
while (true){
// 读取客户端发送的信息
message = in.readLine();
String[] split = message.split(":");
System.out.println("收到客户端"+split[0]+"的消息:" +socket.getInetAddress()+":"+socket.getPort()+"--------message->"+ split[1]);
// 发送响应给客户端
out.println("已收到你的消息:" + split[1]);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
二.编写服务端测试,先跑起来服务端。
@Test
public void demo016socket_server02(){
Socket clientSocket=null;
ServerSocket serverSocket =null;
try {
// 创建ServerSocket对象,指定监听的端口号
serverSocket = new ServerSocket(12345);
System.out.println("等待客户端连接...");
String message;
while (true) {
// 监听客户端的连接请求
clientSocket = serverSocket.accept();
System.out.println("客户端已连接");
new ServerRunner(clientSocket).start();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
三.接下来就是跑起来客户端。
客户端一:
@Test
public void demo016socket_client01(){
try {
// 创建Socket对象,指定服务端的IP地址和端口号
Socket socket = new Socket("127.0.0.1", 12345);
// 获取输入流和输出流 输入流和输出流是通过socket对象来进行数据传输的。
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 从控制台读取用户输入
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String name="客户端一:";
String message="";
while (true) {
System.out.println("请输入要发送的信息(输入 'exit' 退出):");
message = reader.readLine();
if (message.equalsIgnoreCase("exit")) {
// 如果用户输入 'exit',发送终止标志给服务端并退出循环
out.println("exit");
break;
}
// 将用户输入的信息发送给服务端
out.println(name+message);
// 接收服务端的响应并打印
String response = in.readLine();
System.out.println("服务端响应客户端一:" + response);
}
// 关闭连接
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
客户端二:
@Test
public void demo016socket_client02(){
try {
// 创建Socket对象,指定服务端的IP地址和端口号
Socket socket = new Socket("127.0.0.1", 12345);
// 获取输入流和输出流 输入流和输出流是通过socket对象来进行数据传输的。
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 从控制台读取用户输入
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String name="客户端二:";
String message="";
while (true) {
System.out.println("请输入要发送的信息(输入 'exit' 退出):");
message = reader.readLine();
if (message.equalsIgnoreCase("exit")) {
// 如果用户输入 'exit',发送终止标志给服务端并退出循环
out.println("exit");
break;
}
// 将用户输入的信息发送给服务端
out.println(name+message);
// 接收服务端的响应并打印
String response = in.readLine();
System.out.println("服务端响应客户端二:" + response);
}
// 关闭连接
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
最后看看运行结果
先启动服务端测试,在启动客户端测试。
客户端一:
客户端二:
服务端: