单线程,在同时连接两个以上客户端时,只能按顺序接受客户端 socket
如两个客户端连接后,后面的先发送信息,则会阻塞
服务器端:
public class Server {
ServerSocket serverSocket;
Socket socket;
public Server() throws IOException {
serverSocket = new ServerSocket(10086);
// 调用 accept 时才开始监听,等待客户端 socket 连接并将得到的信息包装成 socket 对象返回,否则一直阻塞
while (true) {
socket = serverSocket.accept();
// 接受客户端信息
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("Client : " + br.readLine());
// 反馈
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.write("Received.");
pw.flush();
// 关闭
br.close();
pw.close();
}
}
public static void main(String[] args) {
try {
new Server();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
public class Client {
Socket socket;
public Client() throws UnknownHostException, IOException {
// 使用 socket 对服务器发起连接
socket = new Socket("localhost", 10086);
// 请求内容
PrintWriter pw = new PrintWriter(socket.getOutputStream());
System.out.print("Say:");
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
pw.write(input.readLine());
pw.flush();
// 只关闭流,pw.close 等会直接关闭 socket
socket.shutdownOutput(); // 不调用此方法,客户端一直处于等待(等待输出流完成)
// 服务器响应
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("Server : " + br.readLine());
// 关闭
pw.close();
input.close();
br.close();
}
public static void main(String[] args) {
try {
new Client();
} catch (IOException e) {
e.printStackTrace();
}
}
}
终端命令行运行 eclipse 项目的 java 文件
移除 package
java Server 运行