Разъем отсоединения, разъем отсоединения
Я нашел этот вопрос несколько раз, но я не могу заставить его работать...
Система представляет собой многопользовательскую онлайн-игру, в которой мне нужно отключить клиент и повторно подключить его в рамках той же функции, что и респонент игрока, вот что я делаю:
Клиент:
Я устанавливаю первоначальное соединение с:
var socket = io();
В какой-то момент я проверяю соединение внутри цикла с помощью:
console.log(socket);
Который возвращает:
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), в клиент возвращает:
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
Любой совет приветствуется! Спасибо!
1 ответ
Это может быть намного проще просто переместить код вашего сервера для connect
а также disconnect
на отдельные функции. Вызовите эти функции на connect
а также disconnect
, До сих пор та же логика у вас уже есть, просто другая структура кода.
Затем создайте сообщение socket.io respawn
где вы вызываете свои две функции (первая, которая закрывает пользователя, вторая, чтобы возродить их). Это позволит вам возродиться без фактического повторного подключения к разъему socket.io и избежать проблем, с которыми вы сейчас сталкиваетесь при повторном подключении к соединению socket.io.
Обратите внимание, вы, вероятно, должны также изменить свой disconnect
код, чтобы он возвращал обещание, которое разрешается после его выполнения, поэтому вы можете вызывать свою логику соединения только после завершения логики разъединения.
Тогда все, что нужно сделать клиенту, это:
socket.emit('respawn');