gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:50 25 4
gpt4 key购买 nike

我无法在 android 中保持套接字连接。

我使用 Socket.IO-client我的应用程序中的 java 库。

当屏幕打开时,套接字连接会保持。

但是,如果屏幕关闭,则 socket 会因 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 超时)。

最佳答案

我解决这个问题如下:

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

关于android - 在android中屏幕关闭时无法保持套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36301291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com