目标
实现服务端可以同时接收多个客户端的Socke通信需求。
思路
服务端每接收到一个客户端socket请求对象之后都交给一个独立的线程来处理客户端的数据交互需求。
客户端
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
try {
// 1、请求与服务端的Socket对象链接
Socket socket = new Socket("127.0.0.1",9999);
// 2、得到一个打印流
PrintStream ps = new PrintStream(socket.getOutputStream());
// 3、使用循环不断地发送消息给服务端接收
Scanner sc = new Scanner(System.in);
while (true){
System.out.print("请说:");
String msg = sc.nextLine();
ps.println(msg);
ps.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
*/
public class Server {
public static void main(String[] args) {
try {
// 1、注册端口
ServerSocket ss = new ServerSocket(9999);
// 2、定义一个死循环,负责不断地接收客户端的Socket链接请求
while (true){
Socket socket = ss.accept();
// 3、创建一个独立的线程来处理与这个客户端的socket
new ServerThreadReader(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端独立处理sock线程
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class ServerThreadReader extends Thread{
private Socket socket;
public ServerThreadReader(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
// 从socket对象中得到一个字节输入流
InputStream is = socket.getInputStream();
// 使用缓冲字符输入流包装字节输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg;
while ( ( msg = br.readLine() ) != null){
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}