为什么 Java ServerSocket accept method returns socket 两次来自客户端的一个连接请求?
Why Java ServerSocket accept method returns socket twice for one connect request from a client?
以下为部分Server程序代码
ServerSocket serverSocket = new ServerSocket(port);
...
cameraSocket = serverSocket.accept(); // problematic
下面是要连接到上面服务器的摄像头程序的一部分
sock2server.connect((new InetSocketAddress("127.0.0.1", 6066)), 1000);
问题是:上面有问题的accept语句returns两次for
一个连接请求。 return的间隔大约是7毫秒。
谁能解释一下这个现象?
这是客户端代码(我稍微修改了一下,使之成为一个完整的方法)
仅当客户端首先运行时(在服务器运行之前)才会出现此问题
private Socket connectSocket() {
final short ID_SEND_PERIOD = 100; // irrelevant line maybe
try {
appendLine(cameraGUI.getMsgArea(), "calling at: " + currentTimeMillis());
Socket managerSocket = new Socket();
managerSocket.connect((new InetSocketAddress(serverName, port)), CAMERA_PERIOD);
managerSocket.setSoTimeout(CAMERA_PERIOD);
setManagerOutStream(managerSocket.getOutputStream()); // irrelevant line maybe
setManagerInStream(managerSocket.getInputStream()); // irrelevant line maybe
toleranceLevel = MAX_TOLERANCE; // irrelevant line maybe
sendID_forSure = new Timer(); // irrelevant line maybe
sendID_forSure.schedule(new ID_Sender( // irrelevant line maybe
cameraGUI, getManagerOutStream(), cameraID), // irrelevant line maybe
0, ID_SEND_PERIOD); // irrelevant line maybe
return managerSocket;
} catch (SocketTimeoutException e) {
return null;
} catch (IOException e) {
logParkingExceptionStatus(Level.INFO, e, "IO exception", cameraGUI.getCriticalInfoTextField());
disconnectSocket(e, "IO exception");
return null;
}
}
我知道如何找到解决方案。但是,我不完全理解为什么。
也就是我把上面的代码注释掉了2行
// Socket managerSocket = new Socket();
// managerSocket.connect((new InetSocketAddress(serverName, port)), CAMERA_PERIOD);
并用以下单行替换了这些行。
Socket managerSocket = new Socket(serverName, port);
更改后,即使客户端先运行,accept 也不会执行两次。
如果有人能给出原因,那可能有助于我的理解。谢谢。
对于您所看到的情况,唯一合理的解释是您的相机应用程序实际上连接到服务器两次。
以下为部分Server程序代码
ServerSocket serverSocket = new ServerSocket(port);
...
cameraSocket = serverSocket.accept(); // problematic
下面是要连接到上面服务器的摄像头程序的一部分
sock2server.connect((new InetSocketAddress("127.0.0.1", 6066)), 1000);
问题是:上面有问题的accept语句returns两次for 一个连接请求。 return的间隔大约是7毫秒。
谁能解释一下这个现象?
这是客户端代码(我稍微修改了一下,使之成为一个完整的方法) 仅当客户端首先运行时(在服务器运行之前)才会出现此问题
private Socket connectSocket() {
final short ID_SEND_PERIOD = 100; // irrelevant line maybe
try {
appendLine(cameraGUI.getMsgArea(), "calling at: " + currentTimeMillis());
Socket managerSocket = new Socket();
managerSocket.connect((new InetSocketAddress(serverName, port)), CAMERA_PERIOD);
managerSocket.setSoTimeout(CAMERA_PERIOD);
setManagerOutStream(managerSocket.getOutputStream()); // irrelevant line maybe
setManagerInStream(managerSocket.getInputStream()); // irrelevant line maybe
toleranceLevel = MAX_TOLERANCE; // irrelevant line maybe
sendID_forSure = new Timer(); // irrelevant line maybe
sendID_forSure.schedule(new ID_Sender( // irrelevant line maybe
cameraGUI, getManagerOutStream(), cameraID), // irrelevant line maybe
0, ID_SEND_PERIOD); // irrelevant line maybe
return managerSocket;
} catch (SocketTimeoutException e) {
return null;
} catch (IOException e) {
logParkingExceptionStatus(Level.INFO, e, "IO exception", cameraGUI.getCriticalInfoTextField());
disconnectSocket(e, "IO exception");
return null;
}
}
我知道如何找到解决方案。但是,我不完全理解为什么。 也就是我把上面的代码注释掉了2行
// Socket managerSocket = new Socket();
// managerSocket.connect((new InetSocketAddress(serverName, port)), CAMERA_PERIOD);
并用以下单行替换了这些行。
Socket managerSocket = new Socket(serverName, port);
更改后,即使客户端先运行,accept 也不会执行两次。 如果有人能给出原因,那可能有助于我的理解。谢谢。
对于您所看到的情况,唯一合理的解释是您的相机应用程序实际上连接到服务器两次。