【问题标题】:How to reconnect with socket after server power failure from Android Client从Android客户端服务器电源故障后如何重新连接套接字
【发布时间】:2016-11-24 20:59:23
【问题描述】:

我在python 中有一个server 程序,它向android client 发送和接收data packets。我在android client 中使用TCPsocketspython 程序进行通信。 一切正常,但当server 因 NSF 电源故障而关闭时,它与client 断开连接。

我的问题是,当socket 关闭或断开连接时,我如何始终使用android 服务或任何BroadcastReceiver 或在我的MainActivity 内部检查服务器的可用性。 我不想在server 断电后再次重启我的client application

【问题讨论】:

    标签: java android python sockets


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您可以发送ping 数据包以检查服务器是否处于活动状态。

      【讨论】:

      • 但是在哪里呢?就像我在应用程序的 MainActivity 上一样。
      • 我不知道android,但也许你可以触发一些线程,每隔xxx秒或类似的东西检查你的服务器。
      【解决方案3】:

      对于有同样问题的人。

      我创建了AsyncTaskpingheartbeat server,并在我的MainActivity 中使用Timer 每秒调用此任务。

      new Timer().schedule(new TimerTask(){
        @Override
        public void run(){
            new connectTaskMain().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }
      }, 1000);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 2019-09-12
        • 2023-03-11
        • 1970-01-01
        • 2013-12-05
        • 2014-05-21
        相关资源
        最近更新 更多