Socket.io подключен, но не обменивается данными

У меня очень простая конфигурация на сервере node с установленным socket.io (немного сложнее, но по сути похожа на эту):

var main = require('express')();
    server = require('http').createServer(main);
    io = require('socket.io')(server);

io.use(function(socket, next) {
  console.log("middleware!");
  next();
});

io.on('connection', function (socket) {
  console.log('connected...');

  socket.on('pong', function (data) {
    console.log(data.message);
  });

  setTimeout(function() {
    console.log("Saying hello");
    socket.emit('ping', { message: 'Hello from server ' + Date.now() });

  }, 1000);

});

server.listen(2080, function onCreateServerMain() {
  console.log('Server main is listening on port 2080';
  console.log('************************************************************');
});

В клиенте:

var socketIoScript,
    loadSocketTimeout,
    trialsToLoadSocketIo = 0,
    APP_CFG = {baseUrl : "http://192.168.1.13:2080"};

function loadSocketIo(socketIoIp) {
  socketIoScript = document.createElement('script');
  socketIoScript.setAttribute('src', socketIoIp);
  socketIoScript.setAttribute('onload', 'onSocketLoaded();');
  document.head.appendChild(socketIoScript);
}

window.onSocketLoaded = function onSocketLoaded() {
  if (typeof(io.connect) === 'function') {
    var mSocket,
        mIoSocket;

    $timeout.cancel(loadSocketTimeout);
    mIoSocket = new io.Manager(APP_CFG.baseUrl);

    mIoSocket.connect(function(socket) {
      console.log('Connected!!');
    });
    mIoSocket.on('error', function onSocketError(e) {
      console.log('WebSocket Error ' + error);
    });

    mIoSocket.on('ping', function onPingReceived(e) {
      console.log('Server emitted ping: ' + e.data);
      mSocket.emit('pong', 'hi server!');
    });
  }
}

~(function onLoadSocketTimeout() {
  var nextTimeout;

  if (trialsToLoadSocketIo < 10) {
    nextTimeout = 5000;
  } else if (trialsToLoadSocketIo > 60) {
    nextTimeout = 60000;
  } else {
    nextTimeout = 1000 * trialsToLoadSocketIo;
  }

  if (socketIoScript) {
    document.head.removeChild(socketIoScript);
  }

  loadSocketIo(APP_CFG.baseUrl + '/socket.io/socket.io.js#' + trialsToLoadSocketIo);
  loadSocketTimeout = $timeout(onLoadSocketTimeout, nextTimeout);
  trialsToLoadSocketIo += 1;
})();

(Я делаю так, потому что это мобильное приложение, поэтому оно может не иметь связи). Я тестирую его с помощью Brackets и Chrome. Сервер и клиент находятся на одной машине. В приложении скрипт загружается нормально и подключается к серверу, как я вижу в журнале узла (редактировать: это все, что я получаю в консоли узла):

Server main is listening on port 2080
************************************************************
middleware!
connected...
Saying hello

Редактировать: в консоли Chrome я не получаю никаких сообщений, и любая точка останова останавливается на on слушателях. Если я останавливаю узел, консоль для Chrome немедленно начинает регистрировать это был отключен:

GET http://192.168.1.13:2080/socket.io/?EIO=3&transport=polling&t=1413066902601-6 net::ERR_CONNECTION_REFUSED 
GET http://192.168.1.13:2080/socket.io/?EIO=3&transport=polling&t=1413066906606-7 net::ERR_CONNECTION_REFUSED 

Но я не вижу ни одного входящего сообщения. В приложении не приходят входящие сообщения. Есть ли причина, по которой я не могу общаться в этой среде, даже если сокет успешно подключен?

ИЗМЕНИТЬ

Ни одно приложение не получает события, отправленные с другой стороны. Журналы из узла показывают это, журналы из Chrome пусты.

ИЗМЕНИТЬ

В приложении Chrome я не получаю console.log("Connected!");. Но я также не получаю ERR_CONNECTION_REFUSED ошибок: я ничего не получаю.

ИЗМЕНИТЬ

Мне удалось получить console.log("Connected!"); в приложении, изменив параметры менеджера:

  mIoSocket = new io.Manager(APP_CFG.baseUrl, { autoConnect: false });

Поскольку это было автоматическое подключение, и события были прикреплены после того, как соединение было установлено, «Подключено» так и не было достигнуто. Но я все еще не получаю никаких событий ни в одном приложении.


person Miquel    schedule 11.10.2014    source источник
comment
Что вы имеете в виду, говоря, что в приложении я не получаю входящие сообщения? Вы спрашиваете о клиенте или сервере? И когда вы ожидаете сообщения, если вы его не получили. Извините, но просто непонятно, о каком именно обстоятельстве вы спрашиваете. Известно ли вам, что клиент socket.io имеет логику автоматического повторного подключения и сообщит об отключении, когда логика повторного подключения истечет?   -  person jfriend00    schedule 12.10.2014
comment
Если вы публикуете вопрос, некоторые зрители обнаруживают, что вопрос им не ясен, и задают уточняющие вопросы, но вас нет рядом, чтобы ответить на эти вопросы, тогда вы упустите большую часть возможностей для людей ответить на ваш вопрос. Подавляющее большинство людей увидят ваш вопрос в течение первого часа после публикации. Если вас нет рядом, чтобы прояснить ситуацию, вы упустите большинство людей, которые могли бы вам помочь. Это место не работает как форум, где вы пишете и возвращаетесь завтра. Ваш вопрос может быть закрыт как неясный, о чем вы спрашиваете.   -  person jfriend00    schedule 12.10.2014
comment
@jfriend00 +1 за все, что вы сказали. ОП: console.log('Connected!!') что-нибудь выводит на вашу консоль?   -  person xShirase    schedule 12.10.2014
comment
Голосование за закрытие как неясное, что вы спрашиваете, поскольку вопрос неясен, и ОП не отвечает на звонки с разъяснениями.   -  person jfriend00    schedule 12.10.2014
comment
@ jfriend00 Ты прав насчет времени, мне нужно было идти. Ни одно приложение не получает события друг от друга. В журналах нет логов от on слушателей, поэтому я не думал, что это может быть неясно. В любом случае, я собираюсь отредактировать его, чтобы быть более точным, так как вопрос большой, и некоторые вещи могут быть перечитаны при быстром чтении.   -  person Miquel    schedule 12.10.2014
comment
@ jfriend00 Не могли бы вы проверить мой ответ и посмотреть, не заметите ли вы еще что-то, что идет не так? их так много, что я мог что-то упустить, и я был бы признателен за ваш опыт.   -  person xShirase    schedule 12.10.2014


Ответы (2)


Итак, несколько вещей:

Во-первых, var mSocket, кажется, не инициализирован, поэтому ему может быть сложно что-либо выдать() (я что-то упустил?)

Во-вторых, когда вы делаете:

socket.on('pong', function (data) {
    console.log(data.message);
});

сервер ожидает получить объект, содержащий свойство message, например: data = {message:'hi server'} В вашем случае вы отправляете строку, поэтому data равно 'Hi server !', и в вашем журнале будет указано «не определено». Вы должны изменить этот бит на:

socket.on('pong', function (data) {
    console.log(data);
});

и у вас есть аналогичная проблема наоборот, вы отправляете объект: { message: 'Hello from server ' + Date.now() } и пытаетесь зарегистрировать свойство data, которое не существует. Измените этот бит на:

  console.log('Server emitted ping: ' + e.message);

И в-третьих, вы должны прослушивать события в сокете, а не в «менеджере».

Клиент:

mIoSocket.connect(function(socket) {
    console.log('Connected!!');
    socket.emit('pong');

    socket.on('error', function onSocketError(e) {
        console.log('WebSocket Error ' + error);
    });

    socket.on('ping', function onPingReceived(e) {
        console.log('Server emitted ping: ' + e.data);
        socket.emit('pong', 'hi server!');
    });
});

Сервер:

io.on('connection', function (socket) {
  console.log('connected...');

  socket.on('pong', function (data) {
    console.log(data);
  });

  setTimeout(function() {
    console.log("Saying hello");
    socket.emit('ping', { message: 'Hello from server ' + Date.now() });

  }, 1000);

});
person xShirase    schedule 12.10.2014
comment
Спасибо! Фактически решено 1 минуту назад, установив mIoSocket = new io(APP_CFG.baseUrl);, где проблема заключалась, как вы указали, в прослушивании событий в диспетчере. (другие ошибки, некоторые из них были из-за упрощения вопроса :~) - person Miquel; 12.10.2014
comment
а другие были простыми старыми опечатками ;) Я знаю это чувство, рад, что смог как-то помочь - person xShirase; 12.10.2014

У меня была похожая проблема: обратные вызовы событий на сервере не срабатывали при излучении. Мои события назывались ping и pong. Как только я переименовал эти события, все заработало.

Я подозреваю, что имена событий ping и pong зарезервированы socket.io и поэтому не могут использоваться.

person Cj1m    schedule 22.06.2019