首页 文章

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

提问于
浏览
1

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

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

localhost:2000 remotehost:4899 ESTABLISHED(第一次连接)localhost:2000 remotehost:4890 ESTABLISHED(唤醒后连接)

现在通信没有收到消息 . 但是当服务器向客户端发送消息时,他意识到问题(收到 SocketException :连接重置 . 服务器然后使用新连接,并且客户端同时发送的所有消息将在一次接收时收到!

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

2 回答

  • 1

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

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

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

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

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

  • 1

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

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

相关问题