我写了一个简单的程序,服务器应该打印多个客户端发送的数据。但是服务器只接收部分数据。以下是代码的相关部分。
服务器:
try {
serverSocket = new ServerSocket(8888);
} catch (IOException e) {
System.err.println("Could not listen on port: 8888");
System.exit(-1);
}
while (listening) {
Socket clientSocket = serverSocket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
System.out.println(reader.readLine());
reader.close();
clientSocket.close();
}
serverSocket.close();
客户端:
try {
socket = new Socket("nimbus", 8888);
writer = new PrintWriter(socket.getOutputStream(), true);
localHost = InetAddress.getLocalHost();
}
catch (UnknownHostException e) {}
catch (IOException e) {}
StringBuilder msg1 = new StringBuilder("A: ");
for(int i=1; i<=3; i++)
msg1.append(i).append(' ');
writer.println(localHost.getHostName() + " - " + msg1);
StringBuilder msg2 = new StringBuilder("B: ");
for(int i=4; i<=6; i++)
msg2.append(i).append(' ');
writer.println(localHost.getHostName() + " - " + msg2);
StringBuilder msg3 = new StringBuilder("C: ");
for(int i=7; i<=9; i++)
msg3.append(i).append(' ');
writer.println(localHost.getHostName() + " - " + msg3);
writer.close();
socket.close();
我得到以下输出(当在3个客户端上运行时)
nimbus2 - A: 1 2 3
nimbus3 - A: 1 2 3
nimbus4 - A: 1 2 3
我没有收到第二条和第三条消息。服务器一直在等待我哪里错了?
修改:在服务器代码中,我尝试删除reader.close()
和clientSocket.close()
。那也行不通。另一个问题 - 如果3个客户端发送3条消息,是否需要9个连接? (这就是我在服务器代码中关闭连接的原因)
答案 0 :(得分:1)
您可能希望委托将套接字交给另一个线程。我已经编写了一个示例,它通过将每个传入的套接字传递给Executor来工作,因此它可以读取所有输入。我使用Executors.newCachedThreadPool(),它应该增长到所需的大小。如果您希望它一次只能处理1个客户端,也可以使用Executors.newFixedThreadPool(1)。
我做的唯一其他更改是删除了BufferedReader并将其替换为Scanner。我遇到了BufferedReader没有返回数据的问题。我不确定为什么。
Executor exe = Executors.newCachedThreadPool();
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8888);
} catch (IOException e) {
System.err.println("Could not listen on port: 8888");
System.exit(-1);
}
while (listening) {
final Socket clientSocket = serverSocket.accept();
exe.execute(new Runnable() {
@Override
public void run() {
try {
Scanner reader = new Scanner(clientSocket.getInputStream());
while(reader.hasNextLine()){
String line = reader.nextLine();
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
serverSocket.close();
答案 1 :(得分:0)
在服务器读取他们发送的所有消息之前,看起来您在完成写入之前关闭与客户端的连接。我认为您需要继续readline,并且在向您发送一条消息后可能无法终止客户端的连接。
答案 2 :(得分:0)
约翰是对的。 您在阅读消息后调用clientsocket.close()来关闭客户端连接,这就是您无法获取其他消息的原因。收到所有消息后,你应该调用clientsocket.close()