gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:11:38 25 4
gpt4 key购买 nike

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

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

localhost:2000 remotehost:4899 ESTABLISHED (first connection)

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

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

因此,当服务器尝试发送消息时,我首先意识到网络问题 - 但与此同时没有任何异常或任何情况。我怎样才能正确地应对这个问题 - 以便新连接一建立就可以使用(并且旧连接关闭)?

最佳答案

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

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

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

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

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

关于java - PDA 在挂起模式下失去与 ServerSocket 的 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3165910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com