2016-03-30 2 views
0

У меня есть проблема с тем, чтобы сохранить соединение сокетов в android.не может поддерживать соединение сокета, когда экран выключен в android

Я использую Socket.IO-client java-библиотеку в своем приложении.

Сокетное соединение сохраняется при включенном экране.

но, если экран выключен, разъём отключен, вызванный таймаутом пинга.

как я могу решить эту проблему?

Открой связь как этот.

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

интервал пинг 25 второй, и тайм-аут 60 второй.

когда экран андроида выключен, клиент не работает для EVENT_PING. другое событие работает правильно.

и сервер отключен с журналом (тайм-аут пинга).

+0

В какой версии Android вы наблюдали эту проблему? –

+0

Lollipop (5.0) и Kitkat (4.4) –

+0

Вы используете Android-сервис для этого? –

ответ

1

Я решить эту проблему, как показано ниже:

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

У меня такая же проблема, как и вы - не могли бы вы сообщить мне, какая версия socket.io вы используют также - если я правильно понимаю ваш ответ, вы просто вынуждаете сервер отправлять данные клиенту с фиксированными интервалами, чтобы сохранить сеанс в то время, пока экран отключается? FYI Я использую очень старый файл socket.io 0.9, я думаю, t страдают той же проблемой, и я пытаюсь ее проследить, так как это остановило большой апгрейд. – user3788685

Смежные вопросы