安卓屏幕关闭时无法保持套接字连接

3

我在安卓设备上无法保持socket连接。

我在我的应用中使用了Socket.IO-client java库。

当屏幕开启时,socket连接会一直保持。

但是,如果屏幕关闭,由于ping超时,socket将断开连接。

我是这样打开连接的。

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秒。

当安卓屏幕关闭时,客户端不会处理“EVENT_PING”事件,但其他事件正常工作。

服务器断开连接并记录了“ping超时”的日志。


你在哪个Android版本中观察到这个问题? - Jayakrishnan Salim
棒棒糖(5.0)和奇巧巧克力(4.4) - Hyeonil Jeong
你是在使用 Android Service 吗? - Jayakrishnan Salim
是的。套接字已连接到服务。当屏幕开启时,它将保持连接。 - Hyeonil Jeong
我正在使用Android Service,当屏幕开启时它可以正常工作。但是,如果屏幕关闭了,套接字心跳就无法工作。:( - Hyeonil Jeong
显示剩余3条评论
1个回答

5
我会像下面这样解决这个问题:

我会像下面这样解决这个问题:

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');
    });
});

我和你一样也遇到了同样的问题 - 请问您使用的 socket.io 版本是哪个?如果我理解得没错,您现在只是强制让服务器按照固定的时间间隔向客户端发送数据来保持会话活跃,就算屏幕关闭了也是如此对吗?顺便说一下,我使用的是非常旧的 socket.io 0.9 版本,它并没有遇到同样的问题,我正在尝试追踪这个问题,因为这阻碍了一个重大升级。 - user3788685

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接