java - 服务器断电后如何从Android客户端重新连接套接字

标签 java android python sockets

我在python 中有一个服务器 程序,它向android 客户端 发送和接收数据包。我在 android 客户端 中使用 TCPsockets 来与 python 程序通信。 一切正常,但是当 server 因 NSF 电源故障而关闭时,它会与 client 断开连接。

我的问题是,当socket 已关闭或已断开连接。 我不想在 server 电源故障后再次重新启动我的 client application

最佳答案

在没有数据交换并且没有在套接字上设置 TCP keep-alive 选项的情况下,套接字将不知道远程连接突然消失。这不是什么新鲜事,这是一个众所周知的套接字设计问题。

一般模式是在客户端和服务器之间发送“我还在这里”消息的套接字上有某种保持 Activity 或 ping 协议(protocol),这样两个端点都知道另一端没有消失。当端点离线时,远程套接字将在后续的 recv\send 调用中失败(或抛出异常)。因此,应用程序或服务器可以处理它认为合适的断开连接。但这对移动设备提出了一个有趣的挑战 - 频繁的网络消息可能会因为保持 radio 打开而耗尽电池电量。

包括 Android 在内的移动设备通常不会与服务保持长时间运行的套接字连接。相反,客户端将“按需连接”并在完成后关闭套接字。同样,如果服务器需要向设备发送某些内容,它通常会使用平台的“推送”通知服务。在 Android 上,当前的推送通知服务是 FCM .客户端向 FCM 和服务器注册。当服务器有新东西要给客户端时,它会通过 FCM 发送推送通知。反过来,客户端应用程序获取通知消息作为有新内容可用的唤醒,然后重新连接到服务器以获取实际消息。最好的例子是移动设备上的电子邮件。

关于java - 服务器断电后如何从Android客户端重新连接套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40782240/

相关文章:

java - qt项目代码到xml文件转换

java - JUnit 和检查字段是否为空

java - 如何在没有证书的情况下连接到 https 网络服务?

python - 如何在Python中读取Excel表格中的数据?

python - 从 hmni 包 python 创建匹配概率列

Java 方法引用抛出 NPE

java - 使用适用于 Java 的 Azure 存储 SDK 将 VM 页面 blob 从一个 Azure 订阅复制到另一个 Azure 订阅

Android:QuickContactBadge 中的奇怪行为

android - 如何调整进入深度 sleep 的时间长度

python - 使用 clean() 对带有下划线的字段进行 ModelForm 验证