Android Web socket服务无法在手机屏幕关闭时维护Web连接
我使用heroku的node.js web服务器和android客户端进行web socket.io通信 我想在服务器消息发送到客户端Android时接收它,甚至关闭Android屏幕 所以我基本上是在Android上制作服务、socket.on侦听器、线程和处理程序 还应用了部分唤醒锁定、前台服务、发送通知、每5秒打一次乒乓球 当安卓的屏幕打开时,我的系统运行良好 但在Android屏幕关闭30秒后,网络连接将断开 你能给我一些关于长期运行的web套接字服务源代码的例子,或者一些关于我的代码的解决方案吗 谢谢你的阅读Android Web socket服务无法在手机屏幕关闭时维护Web连接,android,node.js,heroku,websocket,android-webservice,Android,Node.js,Heroku,Websocket,Android Webservice,我使用heroku的node.js web服务器和android客户端进行web socket.io通信 我想在服务器消息发送到客户端Android时接收它,甚至关闭Android屏幕 所以我基本上是在Android上制作服务、socket.on侦听器、线程和处理程序 还应用了部分唤醒锁定、前台服务、发送通知、每5秒打一次乒乓球 当安卓的屏幕打开时,我的系统运行良好 但在Android屏幕关闭30秒后,网络连接将断开 你能给我一些关于长期运行的web套接字服务源代码的例子,或者一些关于我的代码的
主要活动
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP |
PowerManager.ON_AFTER_RELEASE, "My:Tag");
wakeLock.acquire();
//apply wake_lock etc
(...)
Intent serviceIntent = new Intent(getApplicationContext(),CommunicationService.class);
startService(serviceIntent); //init service
通信服务(扩展服务)
类webThread扩展线程:构造函数和运行
在webThread.run中,线程总是每5秒钟向服务器发送一次“ping”
当服务器收到“ping”时,总是回答“pong”
在我看来,当没有“pong”时,它意味着correcate=false,请再次尝试socket.connect()。
这个处理器来自通信服务
public WebThread(String get_url, int input_role, android.os.Handler handler){
try {
socket = IO.socket(get_url);
Log.d("gd","socket status: 0 " + socket.connected());
socket.connect();
socket.emit("join",role,"01");
} catch (URISyntaxException e) {
Log.d("gd", "web server enter failed");
e.printStackTrace();
}
web_listener_init();
this.handler = handler;
Log.d("gd","web thread created");
}
@Override
public void run(){
while(true){
if(isInterrupted())
return;
//when connection status is fine, correspond == true.
if(correspond ==false) {
socket.connect();
socket.emit("join", role, "01");
}
Message msg = Message.obtain();
msg.what = STATE_HEARTBEAT;
handler.sendMessage(msg);
correspond = false;
try {
Thread.sleep(5000);
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}
这是通信服务类中的处理程序
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
case STATE_HEARTBEAT:
webThread.getSocket().emit("send_ping");
//sendNotification("ping");
break;
case STATE_WEB_MESSAGE_RECEIVED:
String webMessage = msg.obj.toString();
Log.d("gd", "handler received from web: " + webMessage);
if(webMessage.equals("pong")){
webThread.isCorrespond(); // make webThread 's 'correspond' = true
}
});
我正在使用nkzawa Socket.io库。如果你能给我一些建议,我将不胜感激。我解决了我的问题。突然断开不是从服务器/服务/乒乓球 它来自安卓本身 如果未对服务类应用唤醒锁(部分唤醒锁) 服务即使是前台也不维护,或定期通知 我只在mainActivity中设置了唤醒锁,它在服务之前运行
所以在服务上应用wake_锁并放置清单 我解决了我的问题。突然断开不是从服务器/服务/乒乓球 它来自安卓本身 如果未对服务类应用唤醒锁(部分唤醒锁) 服务即使是前台也不维护,或定期通知 我只在mainActivity中设置了唤醒锁,它在服务之前运行
所以在服务上应用wake_锁并放置清单 @测试只是将mainactivity中的唤醒锁代码放入服务类。@测试只是将mainactivity中的唤醒锁代码放入服务类。
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
case STATE_HEARTBEAT:
webThread.getSocket().emit("send_ping");
//sendNotification("ping");
break;
case STATE_WEB_MESSAGE_RECEIVED:
String webMessage = msg.obj.toString();
Log.d("gd", "handler received from web: " + webMessage);
if(webMessage.equals("pong")){
webThread.isCorrespond(); // make webThread 's 'correspond' = true
}
});