在退出应用程序之前通过套接字发送最后一条消息
Send last message over socket before exiting app
我有 16 个客户端通过 Android 中的套接字连接到服务器(2 个不同的应用程序项目)。如果有新客户端连接,服务器会跟踪它。
当客户端关闭应用程序时,应通知服务器 1 个客户端已断开连接。问题是我有时只捕捉到事件,有时应用程序关闭得太快而无法发送消息。
实现类似目标的最佳实践是什么?此应用程序仅适用于内部项目,因此解决方案不一定是最漂亮的代码,只要它能工作即可。
这是我的onDestroy()
方法:
@Override
protected void onDestroy() {
super.onDestroy();
if (isConnected) {
sendMessageToServer("ByeBye from " + MainActivity.mPreferences.getString("deviceID", "EMPTY_ID"));
}
if (localClient.getClientSocket() != null) {
if (localClient.getClientSocket().isConnected()) {
try {
localClient.getClientSocket().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
localClient.shutdown();
android.os.Process.killProcess(android.os.Process.myPid());
}
当 Android 需要其他应用程序的一些资源时,Activity 可能会被销毁。那时您的应用可能会被限制使用网络(因为它不在前台)。
最好的地方是在app还可以访问网络的情况下,在Activity::OnStop方法中发送bye message
活动和服务上的 OnDestroy() 不保证会被调用,因此您不能依赖它向您的服务器发送明确的 'bye' 信号以指示服务器关闭该连接。
由于客户端可以并且将会出现意外行为(连接丢失、应用程序崩溃等),因此管理和跟踪连接状态的责任应该在服务器上。如果您在客户端和服务器之间定期发送某种 ping 或 keep-alive,那么您也可以依靠它来跟踪连接状态。如果服务器无法将其发送给客户端或在一定时间内未从客户端接收到它,则连接可能已断开,您可以让服务器认为连接已断开。
我有 16 个客户端通过 Android 中的套接字连接到服务器(2 个不同的应用程序项目)。如果有新客户端连接,服务器会跟踪它。 当客户端关闭应用程序时,应通知服务器 1 个客户端已断开连接。问题是我有时只捕捉到事件,有时应用程序关闭得太快而无法发送消息。
实现类似目标的最佳实践是什么?此应用程序仅适用于内部项目,因此解决方案不一定是最漂亮的代码,只要它能工作即可。
这是我的onDestroy()
方法:
@Override
protected void onDestroy() {
super.onDestroy();
if (isConnected) {
sendMessageToServer("ByeBye from " + MainActivity.mPreferences.getString("deviceID", "EMPTY_ID"));
}
if (localClient.getClientSocket() != null) {
if (localClient.getClientSocket().isConnected()) {
try {
localClient.getClientSocket().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
localClient.shutdown();
android.os.Process.killProcess(android.os.Process.myPid());
}
Activity 可能会被销毁。那时您的应用可能会被限制使用网络(因为它不在前台)。
最好的地方是在app还可以访问网络的情况下,在Activity::OnStop方法中发送bye message
活动和服务上的 OnDestroy() 不保证会被调用,因此您不能依赖它向您的服务器发送明确的 'bye' 信号以指示服务器关闭该连接。
由于客户端可以并且将会出现意外行为(连接丢失、应用程序崩溃等),因此管理和跟踪连接状态的责任应该在服务器上。如果您在客户端和服务器之间定期发送某种 ping 或 keep-alive,那么您也可以依靠它来跟踪连接状态。如果服务器无法将其发送给客户端或在一定时间内未从客户端接收到它,则连接可能已断开,您可以让服务器认为连接已断开。