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

在android屏幕关闭时无法保持套接字连接

薛飞星
2023-03-14

我在android中保持套接字连接有麻烦。

我在应用程序中使用Socket.IO客户端java库。

屏幕打开时保持插座连接。

但是,如果屏幕关闭,套接字会因ping超时而断开连接。

我该如何解决这个问题?

我像这样打开连接。

private static final String EVENT_CONNECT = Socket.EVENT_CONNECT;
private static final String EVENT_MESSAGE = Socket.EVENT_MESSAGE;
private static final String EVENT_DISCONNECT = Socket.EVENT_DISCONNECT;
private static final String EVENT_PING = Socket.EVENT_PING;
private static final String EVENT_CONNECT_TIMEOUT = Socket.EVENT_CONNECT_TIMEOUT;
private static final String EVENT_ERROR = Socket.EVENT_ERROR;

public void connect() {
    if (socket != null && socket.connected() == true) {
        return;
    }
    IO.Options options = new IO.Options();

    options.timeout = 60 * 1000;
    options.reconnection = true;

    Log.d(TAG, "try socket connect");
    socket.on(EVENT_CONNECT, this::onConnected)
            .on(EVENT_MESSAGE, this::onMessage)
            .on(EVENT_DISCONNECT, this::onDisconnected)
            .on(EVENT_PING, this::onPing)
            .on(EVENT_CONNECT_TIMEOUT, this::onConnectTimeout)
            .on(EVENT_ERROR, this::onError);

    socket.connect();
}

这是我的服务器端代码

var Socket = require('socket.io');
var io = Socket(server, { 'pingInterval': 25 * 1000 });
var port = process.env.PORT || 3000;

io.on('connection', function(socket){
    console.log('a user connected');

    ...

    socket.on('disconnect', function(data){
        (typeof socket.member != 'undefined') && disconnect(socket);
        console.log(data);
    });
});

ping间隔为25秒,超时为60秒。

当android屏幕关闭时,客户端不适用于EVENT_PING。其他事件正常工作。

服务器与日志断开连接(ping超时)。

共有1个答案

刘狐若
2023-03-14

我解决这个问题如下:

private static final String EVENT_PING = "ping1";
private static final String EVENT_PONG = "pong1";

public void connect() {
    if (socket != null && socket.connected() == true) {
        return;
    }
    IO.Options options = new IO.Options();

    options.timeout = 60 * 1000;
    options.reconnection = true;

    Log.d(TAG, "try socket connect");
    socket.on(EVENT_CONNECT, this::onConnected)
            .on(EVENT_MESSAGE, this::onMessage)
            .on(EVENT_DISCONNECT, this::onDisconnected)
            .on(EVENT_PING, this::onPing)
            .on(EVENT_CONNECT_TIMEOUT, this::onConnectTimeout)
            .on(EVENT_ERROR, this::onError);

    socket.connect();
}

private void onPing(Object... args) {
    Log.d(TAG, "socket ping");
    socket.emit(EVENT_PONG);
}

这是服务器代码。

var pingInterval = 25 * 1000;
var Socket = require('socket.io');
var io = Socket(server, { 'pingInterval': pingInterval });
var port = process.env.PORT || 3000;

io.on('connection', function(socket){
    console.log('a user connected');

    function sendPing() {
        socket.emit('ping1');
    }

    setTimeout(sendPing, pingInterval);

    socket.on('disconnect', function(data){
        (typeof socket.member != 'undefined') && disconnect(socket);
        console.log(data);
    });

    socket.on('pong1', function(data) {
        setTimeout(sendPing, pingInterval);
        console.log('pong');
    });
});
 类似资料:
  • 我正在使用heroku和android客户端node.jsweb服务器进行websocket.io通信 我想在服务器信息发送到客户端Android系统时收到它,即使Android系统屏幕关闭 所以我基本上是做一个服务,一个套接字。在侦听器上,线程 也确实应用了部分_唤醒_锁定、前台服务、发送通知、每5秒乒乓一次... 当Android的屏幕打开时,我的系统运行良好。 但是在Android屏幕关闭后

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

  • 我试图创建一个Android应用程序,不断记录设备位置数据实时,而设备屏幕关闭。我的代码在Android6.0和更早的版本中工作正常,但似乎Android7.0+破坏了我的应用程序。 我已经实现了一个Android前台服务,它使用wakelock并订阅了Google FusedLocation API。一旦屏幕关闭,回调就永远不会触发。 Android O的代码示例 让应用程序一直在Android

  • 问题内容: 我有一个使用简单套接字在两个系统之间传递某些字符的应用程序。我的Java应用程序作为服务器运行。我建立了良好的连接,甚至传递了一条消息。但是,发送完一条消息后,我的连接关闭。 从我可以看出来的好像是在关闭时,套接字本身正在关闭吗?!这很不好,因为我有多个要在同一连接上发送的消息。 我吃饱了吗?如何在Java中维护此连接? 问题答案: 是的,关闭任何作家/读者将关闭他们包装的所有其他作家

  • 本文向大家介绍Android手机保持屏幕高亮方法,包括了Android手机保持屏幕高亮方法的使用技巧和注意事项,需要的朋友参考一下 一开始接触android应用项目时,在项目快上线时策划要求加个高亮,每次都是直接从网上百度一下,现在做游戏了,却还是这个需求,这里备份一下方便后续的查找,毕竟是自己写好且验证没问题的 :) 首先,在Activity里添加一下代码: 成员变量: 然后,在AndroidM

  • 因此,我有一个客户机wich连续发送和接收数据消息,wich工作正常,然而,当我关闭/停止客户机时,我会得到以下单行错误: 尽管我试图关闭插座--最终封闭了。现在我的问题是为什么我会收到这个错误,这个行为是否正常,以及如何正确处理这个错误。下面是我的代码: