套接字断开,套接字重新连接
Socket disconnect, socket reconnect
我已经多次发现这个问题,但我无法解决...
该系统是一款多人在线游戏,我需要断开客户端并在与玩家重生相同的功能内重新连接,这就是我正在做的事情:
客户:
我正在建立初始连接:
var socket = io();
有时,我正在检查循环内的连接:
console.log(socket);
哪个returns:
n {io: n, nsp: "/", json: n, ids: 812, acks: {…}, …}
acks: {840: ƒ, 841: ƒ, 842: ƒ, 843: ƒ, 844: ƒ, 845: ƒ, 846: ƒ, 847: ƒ, 848: ƒ, 849: ƒ, 850: ƒ, 851: ƒ}
connected: true
disconnected: false
id: "ucS-fRqvhc_3OlYZAAAC"
ids: 852
io: n {nsps: {…}, subs: Array(6), opts: {…}, _reconnection: true, _reconnectionAttempts: Infinity, …}
json: n {io: n, nsp: "/", json: n, ids: 852, acks: {…}, …}
nsp: "/"
receiveBuffer: []
sendBuffer: []
subs: (3) [{…}, {…}, {…}]
_callbacks: {$connecting: Array(1), $connect: Array(1), $update: Array(1), $dialogo-servidor-usuarios: Array(1), $simon-says: Array(1)}
__proto__: Object
最后,我在一个方法中执行断开连接,如下所示:
socket.disconnect();
服务器
socket.on('disconnect', function() {
//socket.reconnect();
//buscamos el nombre del usuario por el id del sock
var player = game.all_player_info(socket.id);
if (player != null) {
//revisamos
console.log(player);
//armamos el pedido
req = API_URI;
req += '?model=user/close';
req += '&username=';
req += player.name;
//no usamos el password del usuario, sino el de la aplicación.
req += '&password='
req += player.pass;
//lo marcamos offline de nuevo.
request(req, { json: true }, (err, res, body) => {
//en caso de error de comunicación
if (err) { return console.log(err); }
//feedback de API
console.log(body);
});
//hacemos el player quede en campo 10 segundos de espera
setTimeout( function() {
//cuando pasen 5'
console.log(req);
//removemos la unidad
game.removePlayer(socket.id);
}, 8000 );
}
});
我试过使用 "socket.socket.reconnect()",我也试过单独使用 "socket.reconnect()"... 仍然无法正常工作。可能只是又累了,但我不确定我在哪里或哪里做错了。
到目前为止,服务器和客户端都在 运行 上 127.0.0.1:443
console.log(socket.io), 在客户端returns:
io: n
autoConnect: true
backoff: r {ms: 1000, max: 5000, factor: 2, jitter: 0.5, attempts: 0}
connecting: [n]
decoder: s {reconstructor: null, _callbacks: {…}}
encoder: n {}
encoding: false
engine: n {secure: true, agent: false, hostname: "127.0.0.1", port: "443", query: {…}, …}
lastPing: Sun Sep 30 2018 12:35:16 GMT-0300 (hora estándar de Argentina) {}
nsps: {/: n}
opts: {path: "/socket.io", hostname: "127.0.0.1", secure: true, port: "443"}
packetBuffer: []
readyState: "open"
skipReconnect: false
subs: (6) [{…}, {…}, {…}, {…}, {…}, {…}]
uri: "https://127.0.0.1"
_callbacks: {$open: Array(1), $packet: Array(1), $close: Array(1)}
_randomizationFactor: 0.5
_reconnection: true
_reconnectionAttempts: Infinity
_reconnectionDelay: 1000
_reconnectionDelayMax: 5000
_timeout: 20000
欢迎任何建议!
谢谢!
将 connect
和 disconnect
的服务器代码移动到单独的函数中可能会容易得多。在 connect
和 disconnect
上调用这些函数。到目前为止,仍然是您已有的相同逻辑,只是代码结构不同。
然后,创建一条 socket.io 消息 respawn
,您可以在其中调用您的两个函数(第一个关闭用户,第二个重新生成它们)。这将使您无需实际重新连接 socket.io 连接即可重生,并避免您现在重新连接 socket.io 连接时遇到的问题。
请注意,您可能还应该修改您的 disconnect
代码,以便它 returns 一个在完成时解析的承诺,这样您就可以仅在断开连接逻辑完成后调用您的连接逻辑。
那么,客户所要做的就是:
socket.emit('respawn');
我已经多次发现这个问题,但我无法解决...
该系统是一款多人在线游戏,我需要断开客户端并在与玩家重生相同的功能内重新连接,这就是我正在做的事情:
客户:
我正在建立初始连接:
var socket = io();
有时,我正在检查循环内的连接:
console.log(socket);
哪个returns:
n {io: n, nsp: "/", json: n, ids: 812, acks: {…}, …}
acks: {840: ƒ, 841: ƒ, 842: ƒ, 843: ƒ, 844: ƒ, 845: ƒ, 846: ƒ, 847: ƒ, 848: ƒ, 849: ƒ, 850: ƒ, 851: ƒ}
connected: true
disconnected: false
id: "ucS-fRqvhc_3OlYZAAAC"
ids: 852
io: n {nsps: {…}, subs: Array(6), opts: {…}, _reconnection: true, _reconnectionAttempts: Infinity, …}
json: n {io: n, nsp: "/", json: n, ids: 852, acks: {…}, …}
nsp: "/"
receiveBuffer: []
sendBuffer: []
subs: (3) [{…}, {…}, {…}]
_callbacks: {$connecting: Array(1), $connect: Array(1), $update: Array(1), $dialogo-servidor-usuarios: Array(1), $simon-says: Array(1)}
__proto__: Object
最后,我在一个方法中执行断开连接,如下所示:
socket.disconnect();
服务器
socket.on('disconnect', function() {
//socket.reconnect();
//buscamos el nombre del usuario por el id del sock
var player = game.all_player_info(socket.id);
if (player != null) {
//revisamos
console.log(player);
//armamos el pedido
req = API_URI;
req += '?model=user/close';
req += '&username=';
req += player.name;
//no usamos el password del usuario, sino el de la aplicación.
req += '&password='
req += player.pass;
//lo marcamos offline de nuevo.
request(req, { json: true }, (err, res, body) => {
//en caso de error de comunicación
if (err) { return console.log(err); }
//feedback de API
console.log(body);
});
//hacemos el player quede en campo 10 segundos de espera
setTimeout( function() {
//cuando pasen 5'
console.log(req);
//removemos la unidad
game.removePlayer(socket.id);
}, 8000 );
}
});
我试过使用 "socket.socket.reconnect()",我也试过单独使用 "socket.reconnect()"... 仍然无法正常工作。可能只是又累了,但我不确定我在哪里或哪里做错了。
到目前为止,服务器和客户端都在 运行 上 127.0.0.1:443
console.log(socket.io), 在客户端returns:
io: n
autoConnect: true
backoff: r {ms: 1000, max: 5000, factor: 2, jitter: 0.5, attempts: 0}
connecting: [n]
decoder: s {reconstructor: null, _callbacks: {…}}
encoder: n {}
encoding: false
engine: n {secure: true, agent: false, hostname: "127.0.0.1", port: "443", query: {…}, …}
lastPing: Sun Sep 30 2018 12:35:16 GMT-0300 (hora estándar de Argentina) {}
nsps: {/: n}
opts: {path: "/socket.io", hostname: "127.0.0.1", secure: true, port: "443"}
packetBuffer: []
readyState: "open"
skipReconnect: false
subs: (6) [{…}, {…}, {…}, {…}, {…}, {…}]
uri: "https://127.0.0.1"
_callbacks: {$open: Array(1), $packet: Array(1), $close: Array(1)}
_randomizationFactor: 0.5
_reconnection: true
_reconnectionAttempts: Infinity
_reconnectionDelay: 1000
_reconnectionDelayMax: 5000
_timeout: 20000
欢迎任何建议! 谢谢!
将 connect
和 disconnect
的服务器代码移动到单独的函数中可能会容易得多。在 connect
和 disconnect
上调用这些函数。到目前为止,仍然是您已有的相同逻辑,只是代码结构不同。
然后,创建一条 socket.io 消息 respawn
,您可以在其中调用您的两个函数(第一个关闭用户,第二个重新生成它们)。这将使您无需实际重新连接 socket.io 连接即可重生,并避免您现在重新连接 socket.io 连接时遇到的问题。
请注意,您可能还应该修改您的 disconnect
代码,以便它 returns 一个在完成时解析的承诺,这样您就可以仅在断开连接逻辑完成后调用您的连接逻辑。
那么,客户所要做的就是:
socket.emit('respawn');