为什么Java ServerSocket accept方法为来自客户端的一个连接请求返回套接字两次?

时间:2015-05-23 04:55:34

标签: java connect serversocket

以下是服务器程序代码的一部分

ServerSocket serverSocket = new ServerSocket(port);
...

cameraSocket = serverSocket.accept(); // problematic

以下是想要连接上述服务器的相机程序的一部分

sock2server.connect((new InetSocketAddress("127.0.0.1", 6066)), 1000);

问题是:上面有问题的accept语句返回两次 一个连接请求。返回的间隔约为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;
    }    
}

我有些人如何找到解决方案。但是,我不完全理解为什么。 也就是说,我从上面的代码中注释掉了两行

// Socket managerSocket = new Socket();
// managerSocket.connect((new InetSocketAddress(serverName, port)), CAMERA_PERIOD);

用以下单行替换这些行。

Socket managerSocket = new Socket(serverName, port);

更改后,即使客户端先运行,accept也不会执行两次。 如果有人能说出理由,那可能有助于我理解。感谢。

1 个答案:

答案 0 :(得分:2)

您所看到的唯一可信的解释是您的相机应用程序实际连接到服务器两次。