![](/img/trans.png)
[英]Java TCP Server doesn't accept client request after receiving 16384 bytes MAC OS
[英]TCP. client connects even if server doesn't accept him
我有TCP服务器客户端应用程序。 它可以工作,但有时会发生一些事情。 客户端连接到服务器,但服务器说他不接受他。
服务器端代码:
while(!stopped){
try {
AcceptClient();
} catch(SocketTimeoutException ex){
continue;
} catch (IOException ex) {
System.err.println("AppServer: Client cannot be accepted.\n"+ex.getMessage()+"\n");
break;
}
...
private void AcceptClient() throws IOException {
clientSocket = serverSocket.accept();
clientSocket.setSoTimeout(200);
out = new ObjectOutputStream(clientSocket.getOutputStream());
in = new ObjectInputStream(clientSocket.getInputStream());
System.out.println("Accepted connection from "+clientSocket.getInetAddress());
}
客户端代码:
try {
socket = new Socket(IPAddress, serverPort);
socket.setSoTimeout(5000);
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
} catch (IOException e1) {
sendSystemMessage("DISCONNECTED");
sendSystemMessage(e1.getMessage());
return;
}
sendSystemMessage("CONNECTED");
如果客户端连接消息:
出现从...接受的连接。 但是有时即使客户发送消息“ CONNECTED”也不会出现
服务器仍在尝试获取客户端的循环中运行,并且正在捕获socketTimeoutException。 客户端已连接,发送消息并等待响应。
我怀疑客户端的“ sendSystemMessage()”中缺少“刷新”。 不幸的是,ObjectInputStream的构造方法试图从基础流中读取标头(这不是很直观的恕我直言)。 因此,如果客户端无法刷新数据-服务器可能会停留在“ in = new ObjectInputStream(socket.getInputStream())”行中...
附带说明一下,通常最好由服务器为每个传入的客户端启动线程,但这只是附带说明(此外,它显然取决于要求)。
我发现了问题。 我的网络上的通信速度太慢,因此在获取输入流时超时。 解决方案包括两个部分。 在获取输入流之前冲洗输出流。 并在流初始化后设置套接字timout。
服务器端:
clientSocket = serverSocket.accept();
out = new ObjectOutputStream(clientSocket.getOutputStream());
out.flush()
in = new ObjectInputStream(clientSocket.getInputStream());
clientSocket.setSoTimeout(200);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.