Everybody!小编我又回来了。上篇文章:Java — ServerSocket 和 Socket 简单通信 完整步骤 我们讲到了 socket 简单通信,相信各位都有大差不差的了解了。这篇文章呢,咱们继续走起。但是,新的东西着实不多,就加了个多线程处理,用于多客户端消息请求。小编绝对用最生动的表述给各位讲清楚!Let go!
1,建立客户端1。
/**
* @author:
* @description:
* @date: 2022/4/14
**/
public class ServerClient1 {
public static void main(String[] args) throws IOException {
//1,创建服务器连接,指定Ip,和端口,这个可以根据自己的情况设定
Socket socket = new Socket("localhost", 8080);
//2,打开socket 输出流,准备写入数据,要发送给服务器的信息
OutputStream outputStream = socket.getOutputStream();
//3,创建printwriter
PrintWriter printWriter = new PrintWriter(outputStream);
//4,写入数据
printWriter.write("你好,我是客户端1号。");
//5,刷新
printWriter.flush();
/**
* 客户端和服务器端建立连接后,服务器端会持续等待客户端传来的数据,如客户端写入数据后,不执行shutdownOutput。
* 服务器端会一直等待,客户端和服务器端就会一直处于僵持状态。
* 执行shutdownOutput,关闭客户端输出流,服务器输入流也随之关闭
*/
socket.shutdownOutput();
//6,打开输入流,准备读出从服务器端发来的数据
InputStream inputStream = socket.getInputStream();
//7,创建 bufferedreader
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
//8,读取数据
String msg = "";
while ( (msg = reader.readLine()) != null){
System.out.println("这里是客户端1号,服务器端发来:" + msg);
}
//9,关闭流。流是一个管道,连接内存和硬盘,用完后如果不关闭,会耗费(占用)很多资源
reader.close();
inputStream.close();
printWriter.close();
outputStream.close();
}
}
2,建立客户端2,类似客户端1。
/**
* @author:
* @description:
* @date: 2022/4/14
**/
public class ServerClient2 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 8080);
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.write("hi,我是客户端2号。");
printWriter.flush();
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String msg = "";
while ( (msg = reader.readLine()) != null){
System.out.println("这里是客户端2号,服务器端发来:" + msg);
}
reader.close();
inputStream.close();
printWriter.close();
outputStream.close();
}
}
3,建立服务器端。
/**
* @author:
* @description:
* @date: 2022/4/14
**/
public class SocketServerOneTwo {
public static void main(String[] args) {
try {
//1,创建服务器端serverSocket,监控8080端口,和客户端保持一致
ServerSocket serverSocket = new ServerSocket(8080);
//2,创建客户端socket
Socket socket = new Socket();
//3,循环监听等待客户端连接
while (true){
//4,监听客户端
socket = serverSocket.accept();
//5,创建服务处理线程
ServerSocketThread socketThread = new ServerSocketThread(socket);
//6,启动线程
socketThread.start();
}
} catch (Exception e){
e.printStackTrace();
}
}
}
4,创建线程类
/**
* @author:
* @description:
* @date: 2022/4/14
**/
public class ServerSocketThread extends Thread{
private Socket socket;
//构造器
public ServerSocketThread(Socket socket) {
this.socket = socket;
}
@SneakyThrows
@Override
public void run() {
//1, 打开输入流,准备读取数据
InputStream inputStream = socket.getInputStream();
//2,创建 bufferedreader, 接收读取的数据
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String str = "";
//3,读取数据
while ( (str = reader.readLine()) != null){
System.out.println("这里是服务器端,客户端发来:" + str);
}
//4,关闭输入流
socket.shutdownInput();
//5,打开输出流,准备写入数据
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.write("你好客户端,这是服务器端,感谢发来消息。");
printWriter.flush();
socket.shutdownOutput();
printWriter.close();
reader.close();
inputStream.close();
outputStream.close();
}
}
5,测试结果:
(1) 服务器端控制台:
"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe"
这里是服务器端,客户端发来:你好,我是客户端1号。
这里是服务器端,客户端发来:hi,我是客户端2号。
(2) 客户端1控制台:
"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe"
这里是客户端1号,服务器端发来:你好客户端,这是服务器端,感谢发来消息。
Process finished with exit code 0
(3) 客户端2控制台:
"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe"
这里是客户端2号,服务器端发来:你好客户端,这是服务器端,感谢发来消息。
Process finished with exit code 0