Разъем отсоединения, разъем отсоединения - PullRequest
0 голосов
/ 30 сентября 2018

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

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


Клиент:

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

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 Ответ

0 голосов
/ 01 октября 2018

Гораздо проще просто переместить код вашего сервера для connect и disconnect в отдельные функции.Вызовите эти функции на connect и disconnect.До сих пор та же логика, что у вас уже есть, просто другая структура кода.

Затем создайте сообщение socket.io respawn, в котором вы вызываете две функции (первая, которая закрывает пользователя,второй, чтобы возродить их).Это позволит вам возродиться без фактического повторного подключения к разъему socket.io и избежать проблем, с которыми вы сейчас сталкиваетесь при повторном подключении к соединению socket.io.

Обратите внимание, что вам, вероятно, следует также изменить код disconnect, чтобыон возвращает обещание, которое разрешается, когда оно выполнено, поэтому вы можете вызывать свою логику соединения только после завершения логики разъединения.

Тогда все, что клиент должен будет сделать, это:

socket.emit('respawn');
...