PDA在挂起模式下丢失与ServerSocket的TCP连接

时间:2010-07-02 13:08:54

标签: java networking

我正在使用ServerSocket实现一个java TCP / IP服务器,以通过网络套接字接受来自客户端的消息。

工作正常,但PDA上的客户端(WIFI条形码扫描器除外)。 如果我在服务器和pda之间建立了连接 - 并且在一些空闲时间后pda goues进入挂起(待机) - 那么连接就会出现问题。 当pda再次唤醒时,我可以在tcp监视器中观察到,建立了与不同端口的第二个连接,但旧的端口仍然建立:

  

localhost:2000 remotehost:4899 ESTABLISHED(第一次连接)

     

localhost:2000 remotehost:4890 ESTABLISHED(唤醒后连接)

现在通信不起作用,因为客户端现在使用新连接,但服务器仍然侦听旧连接 - 因此服务器不接收消息。但是当服务器向客户端发送消息时,他意识到问题(接收SocketException:连接重置。服务器然后使用新连接,并且客户端同时发送的所有消息都将被接收一击!

所以我首先意识到网络问题,当服务器尝试发送消息时 - 但同时没有例外或任何事情。我如何正确地对这个问题作出反应 - 以便在建立新连接时使用新连接(并且旧连接已关闭)?

2 个答案:

答案 0 :(得分:1)

听起来主要问题是您希望服务器在旧连接过时时实现并删除旧连接。

您是否考虑过在服务器端套接字(连接套接字,而不是ServerSocket)上的连接上设置超时,以便在一段时间后关闭/删除它?也许在Socket上SO_TIMEOUT到期后,您可以使用echo / keepalive命令对其进行测试,以验证连接是否仍然正常。

答案 1 :(得分:1)

根据您的描述,我猜服务器的结构如下:

server_loop
{
    client_socket = server_socket.accept()
    TalkToClientUntilConnectionCloses(client_socket)
}

我将其更改为并行处理传入连接和已建立的连接。最简单的方法(从实现的角度来看)是为每个客户端启动一个新线程。一般来说这不是一个好的方法(它的可扩展性很差),但是如果你不期望很多客户端并且能够负担得起它,那就改变这样的服务器:

server_loop
{
    client_socket = server_socket.accept()
    StartClientThread(client_socket)
}

作为奖励,您可以同时处理多个客户端(以及附加的所有麻烦)。