Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Web socket服务无法在手机屏幕关闭时维护Web连接_Android_Node.js_Heroku_Websocket_Android Webservice - Fatal编程技术网

Android Web socket服务无法在手机屏幕关闭时维护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套接字服务源代码的例子,或者一些关于我的代码的

我使用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
                        }
               });