当前位置: 首页 > 知识库问答 >
问题:

Android Web套接字服务在移动屏幕关闭时不维护Web连接

楮阳
2023-03-14

我正在使用heroku和android客户端node.jsweb服务器进行websocket.io通信

我想在服务器信息发送到客户端Android系统时收到它,即使Android系统屏幕关闭

所以我基本上是做一个服务,一个套接字。在侦听器上,线程

也确实应用了部分_唤醒_锁定、前台服务、发送通知、每5秒乒乓一次...

当Android的屏幕打开时,我的系统运行良好。

但是在Android屏幕关闭后约30秒,网络连接将断开连接

你能给我一些关于长期运行的web socket服务源代码的例子或者一些关于我的代码的解决方案吗?

谢谢你的阅读。

主要活动

 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

通信服务(扩展服务)

 @Override
    public int onStartCommand(Intent intent, int flags, int startId){

 //start foreground-service

         Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent =
                PendingIntent.getActivity(this, 0, notificationIntent, 0);

            Log.d("gd","entering");
            notification =
                    new Notification.Builder(this, CHANNEL_ID)
                            .setContentTitle("KD SERVICE TEST")
                            .setContentText("now koda testing" )
                            .setSmallIcon(R.drawable.ic_android_ex)
                            .setContentIntent(pendingIntent)
                            .build();


        startForeground(1, notification);


         if(webThread == null) {
            Log.d("gd","webthread begin");
            webThread = new WebThread(url, role, this.handler);
            webThread.start();

        }
        return START_NOT_STICKY; //I tried STICKY, but nothing 


类webThread扩展线程:构造函数和运行

在webThread.run中,线程总是每5秒向服务器发送一次“ping ”,当服务器得到“ping”时,总是回答“pong”

在我的意图中,当没有'pong'时,它意味着对应=假,尝试再次套接字.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 图书馆。如果能提供一些建议,我们将不胜感激。

共有1个答案

太叔灿
2023-03-14

我解决了我的问题。突然断开不是来自服务器/服务/乒乓球。

来自android本身。

如果不对服务类应用wake_lock(paritial_wake_lock),则

服务不维护,即使其服务是前台,或定期通知

我确实只在main active中设置了唤醒锁,它在服务之前运行。

因此,请在服务上应用wake_lock并放置清单!

 类似资料:
  • 我在android中保持套接字连接有麻烦。 我在应用程序中使用Socket.IO客户端java库。 屏幕打开时保持插座连接。 但是,如果屏幕关闭,套接字会因ping超时而断开连接。 我该如何解决这个问题? 我像这样打开连接。 这是我的服务器端代码 ping间隔为25秒,超时为60秒。 当android屏幕关闭时,客户端不适用于。其他事件正常工作。 服务器与日志断开连接(ping超时)。

  • 我在netty server应用程序中面临资源问题。 无法看到与Netstat的任何打开或挂起的连接... 我使用ReadTimeoutHandler关闭未使用的连接,并使用以下exceptionHandler代码: 服务器引导程序如下所示: 更新2:根据请求,我将日志处理程序移到ReadTimeouthandler前面,以下是日志。客户端通常断开连接的情况: 客户端不断开连接的情况: 所以收盘前

  • 问题内容: 我敢肯定这是一个简单的问题,但是我不知道socket.io文档在哪里,而http://labs.learnboost.com/socket.io/上的文档并没有真正的帮助。 假设我有一个socket.io http服务器,并写了一个网站来连接它。 我如何为服务器提供保护,以使未经授权的人(未通过网站连接的人)被阻止/丢弃/禁止。 如何在服务器端结束套接字连接?所以如果我有 如何结束套接

  • 我的springboot微服务依赖于AS400 DB2,当服务启动时,它可能会关闭。该服务有一个配置bean,它有autowired的基于JpaRepository的存储库。在启动期间,当DB2关闭时,我得到以下消息:

  • 关闭屏幕盖时   设定关闭屏幕盖时的动作。 标准 关闭屏幕盖时,显示专用的画面。 进入睡眠模式 让主机进入睡眠模式。 提示 若主机处于锁定状态(POWER(电源)/HOLD(固定)按钮滑至下方),即使已选择[进入睡眠模式],主机仍不会在关闭屏幕盖时进入睡眠模式。 屏幕盖关闭时显示的画面 在屏幕盖关闭时按下L/R按钮,即可变更显示的内容。 同时按下L/R按钮 每次同时按下L/R按钮,可交替显示月历/

  • 如果我不关闭套接字: 客户端没有输出。服务器从不发送消息,或者客户端从不接收消息。 有人知道发生这种情况的可能原因吗?客户端使用一个线程接收消息,一个线程发送消息。客户端套接字在主客户端线程中创建,因此接收者和发送者线程使用当前套接字进行通信。 提前谢了。