据我所知,在wifi网络上突然断开连接,导致我无法向服务器发送消息。
但有时在断开连接之前还有最后一次机会,例如,如果信号很低或者用户试图关闭wifi。在那些情况下,我想向我的服务器发送注销消息。
如何检测那些断线?
我尝试通过注册广播监听器来检索连接的变化:
registerReceiver(this,new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
...
public void onReceive(Context context, Intent intent) {
NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if( (info.getState()== State.DISCONNECTING) && (info.getType() == ConnectivityManager.TYPE_WIFI) ) {
//send logout
}
但在那个时候看起来已经太晚了。我的注销消息没有通过。
有更好的方法吗?
[更新1] 我也尝试过:
if( (info.getDetailedState()== DetailedState.DISCONNECTING) && connectionTypeOK ) {
[更新2 - 解决方案] 如下所述,该解决方案使用接收RSSI_CHANGED_ACTION和WIFI_STATE_CHANGED_ACTION广播的组合来分别监视信号强度和WIFI_STATE_DISABLING事件。发生这种情况时,我发送我的注销请求。这完全符合我的需要。谢谢!
答案 0 :(得分:4)
您可以尝试使用WifiManager来检测信号强度的变化,从而实现变量“心跳”功能。 Here你可以找到一些相关的代码,顺便说一句。
现在,一旦收到RSSI_CHANGED通知,根据相应的信号强度,您将更新应用程序“心跳”的频率到服务器:如果信号很强,您只需要不经常通知服务器该应用程序还活着。然而,一旦信号变成一周,就像肾上腺素为真实生物而踢,那么你的应用应该更频繁地通知服务器。如果信号的强度恢复,您将发送一条特定的消息让服务器再次知道一切正常;但是,如果服务器在一段时间内没有收到此消息并且“心跳”停止 - 您的应用程序停止通知该时间 - 然后服务器将其记录下来,直到再次收到它为止。
答案 1 :(得分:1)
如果您基于TCP连接,服务器应该知道会话意外断开连接 - 它将获得RST或FIN数据包,具体取决于客户端和服务器之间的路由器配置。 从客户端的角度来看,没有必要做任何事情 - TCP连接的设计使您可以知道它们何时被中断。
答案 2 :(得分:0)
为什么不让服务器定期ping客户端,并且只是在没有得到响应的情况下注销?试图通过客户端实现这一点将是麻烦的。
答案 3 :(得分:0)
更好的方法是尽可能没有会话。
如果用户没有注销,为什么会出现问题?
答案 4 :(得分:0)
也许这是一个很长的镜头......但是如果启用了wifi,为什么不使用Google推送通知来启动活动。那会告诉服务器手机是“在线”的。如果在X秒或1分钟内没有发生这种情况,请将其重定向到其他地方。
答案 5 :(得分:0)
我会在服务器上实现一个处理程序,用于处理客户端无法接收消息的时间。在每条消息之后,电话可以向服务器发送消息,说它已成功接收消息。
答案 6 :(得分:0)
您是否正在寻找用户在断开连接后发送/接收数据的好方法?
HTML5具有本地存储(文件大小也很好),因此如果用户尝试使用大型表单,则首先将其保存在本地,然后尝试将其发送到服务器。如果用户再次加载页面时失败,您可以先检查文件是否包含某些内容,如果是,则可以发送该数据,清除内容并继续相应操作。
可能会帮助你http://www.html5rocks.com/tutorials/appcache/beginner/
或查看本地存储教程:http://www.youtube.com/watch?v=h0uZIljjElo
使用它可以保存频繁的状态数据并动态修改。
和Android也应该支持HTML5。