Разъем отсоединения, разъем отсоединения

Я нашел этот вопрос несколько раз, но я не могу заставить его работать...

Система представляет собой многопользовательскую онлайн-игру, в которой мне нужно отключить клиент и повторно подключить его в рамках той же функции, что и респонент игрока, вот что я делаю:


Клиент:

Я устанавливаю первоначальное соединение с:

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');
Другие вопросы по тегам