有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

工作正常,但PDA(WIFI条形码扫描仪)上的客户端除外。 如果我有一个服务器和pda之间的连接-和pda进入暂停(待机)后,一段空闲时间-那么将有问题的连接。 当pda再次唤醒时,我可以在tcp监视器中观察到,与另一个端口的第二个连接已建立,但旧的连接仍保持建立状态:

localhost:2000 remotehost:4899 ESTABLISHED (first connection)

localhost:2000 remotehost:4890 ESTABLISHED (connection after wakeup)

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

因此,当服务器试图发送消息时,我首先意识到了网络问题——但在此期间,没有异常或任何事情。我如何正确地应对此问题?以便在新连接建立(旧连接关闭)后立即使用新连接


共 (2) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

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

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

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

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

    作为奖励,您可以同时处理多个客户端(以及所有附带的问题)