Socket IO не получает от клиента - Node JS - PullRequest
0 голосов
/ 13 ноября 2018

Я работаю над Socket IO, соединение между клиентом и сервером установлено успешно. Я сталкиваюсь с двумя проблемами:

1 - Когда между клиентом и сервером установлено первоначальное соединение, socket.client.id на сервере и socket.id на стороне клиента, оба одинаковы, но когда я обновляю страницу клиента, идентификатор клиента меняется на другой, но на сервере он все тот же. Это создает какие-либо проблемы / проблемы при общении с сервером или даже с клиентом с использованием сокетов, при этом не имея одинаковые идентификаторы? или идентификатор сервера изменяется при обновлении клиентской страницы?

2 - при первоначальном установлении соединения сокет передает сообщения, используя socket.emit() с сервера, и получает как socket.on() на клиенте. Но когда я пытаюсь передать что-либо из клиента, оно не будет получено на сервере.

Разъемные соединения

function Globals() {

  this.socketConnection = async function() {
    let p = new Promise(function(res, rej) {
      io.on("connection", function(socket) {
        if (socket.connected) {
          res(socket);
        } else {
          rej("Socket Connection Error !");
        }
      })
    })
    return await p;
  }
}

new Globals().socketConnection().then(function(soc) {
  console.log(soc.client.id);
  socket = soc;
  soc.emit("Hi");
  soc.on("Nady", function() {
    console.log("I am called");
  })
})

Подключение на стороне клиента

function Globals() {
  this.socketConnection = async function() {

    var socket = io('http://localhost:8080');

    let p = new Promise(function(res, rej) {
      socket.on('connect', function() {
        if (socket.connected) {
          console.log(socket.id);
          res(socket);
        }
      })
    })

    return await p;
  }
}

var socket;
new App().socketConnection().then(function(s) {
  socket = s;
});

function ScrapJobs() {

  var socket;
  new App().socketConnection().then(function(s) {
    socket = s;
  });
  var _this = this;

  this.attachListeners = function() {
    qs("#init-scrap").ev("click", _this.startScrapping);
  }

  this.startScrapping = function() {
    console.log("I am cliced");
    socket.on("Hi", function() {
      console.log("Hi Nadeem");
    })
    socket.emit("Nady");
  }

}

1 Ответ

0 голосов
/ 13 ноября 2018

Когда между клиентом и сервером установлено первоначальное соединение, socket.client.id на сервере и socket.id на стороне клиента одинаковы, но когда я обновляю страницу клиента, идентификатор клиента меняется на другой, но на сервере он все тот же. Делает ли это какие-либо проблемы

Клиентское значение socket.id устанавливается на объекте сокета клиента после получения события connect и обновляется (например, изменяется) после события reconnect.

Похоже, что инфраструктура socket.io сохранит их одинаковыми на клиенте и сервере. Если клиент отключается, а затем повторно подключается, будет новое соединение с новым идентификатором как на клиенте, так и на сервере. Возможно, вы пытаетесь повесить на старый объект сокета на сервере после того, как клиент отключил его (мы не можем увидеть достаточно кода вашего сервера, чтобы оценить это).

При первоначальном установлении соединения сокет передает сообщения, используя socket.emit () с сервера, и получает как socket.on () на клиенте. Но когда я пытаюсь передать что-либо из клиента, оно не будет получено на сервере.

Вы должны показать нам воспроизводимый случай. Этого не происходит, если вы правильно кодируете вещи. Я полагаю, что у вас нет подходящих слушателей для сообщений в правом сокете, чтобы видеть сообщения, которые вы отправляете. Я обещаю вам, что отправка сообщения с клиента на сервер работает нормально, если все реализовано правильно.


Общий комментарий о вашем коде. Оба кодовых блока, которые вы показываете, по-видимому, вставляют объект socket в переменную с более высокой областью действия (или, возможно, даже глобальную). Вероятно, это одна из причин вашей проблемы, потому что этот объект сокета может стать мертвым, если клиент по какой-либо причине переподключится. Кроме того, помещение любого типа объекта сокета в глобальную переменную или переменную уровня модуля делает ваш сервер способным обслуживать только одного клиента - это просто не то, как вы проектируете многопользовательские серверы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...