Клиент Socket.io не работает должным образом

Я создал приложение чата, используя следующие

  1. Рельсы
  2. Rabbitmq
  3. nodejs (с amqplib/callback_api и socket.io)

У меня есть следующий код на стороне сервера

var amqp = require('amqplib/callback_api');
var amqpConn = null;

var app = require('http').createServer()
var io = require('socket.io')(app);
var fs = require('fs');

io.on('connection', function (socket) {
        socket.emit('news/1', msg.content.toString());
        // socket.disconnect()
});

сторона клиента

<%= javascript_include_tag "http://localhost:53597/socket.io/socket.io.js"  %>
<script>



var socket = io('http://localhost:53597', {reconnect: true});

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

    socket.on('news/1', function (msg) {
      console.log('inside coming');
      console.log(msg);
    });
  });

</script>

Когда я отправляю сообщение, сообщение успешно помещается в очередь, а сообщения отправляются в сокет. Проблема в том, что я могу получать сообщения, когда только обновляю страницу, а сообщения не удаляются.

Я не могу понять, что здесь не так?


person empr    schedule 24.03.2017    source источник
comment
Вы вызываете socket.emit только во время события подключения или у вас есть другие вызовы, не показанные в вашем коде? В противном случае, как написано, кажется, что у него будет только один выброс. Просто для проверки вы можете добавить socket.emit в функцию, запускаемую setInterval на сервере. Кроме того, не уверен, что сообщения не удаляются, я ничего не вижу в коде, который выполняет какое-либо удаление.   -  person barry-johnson    schedule 24.03.2017
comment
@barry: Вы вызываете socket.emit только во время события подключения? да   -  person empr    schedule 24.03.2017
comment
Мое единственное требование - получить сообщение из очереди rabbitmq и отправить сообщение прослушивающим сокетам. У меня проблемы с клиентом socket.io, но прослушивание работает нормально, потому что я могу показывать сообщения об ошибках в консоли браузера, когда останавливаю сервер nodejs.   -  person empr    schedule 24.03.2017
comment
Извините за задержку, так как отсутствовал на собраниях. В любом случае, как я уже сказал, если вы вызовете socket.emit(...) только один раз, он отправит только одно сообщение. Я не пользователь RabbitMQ, но из беглого взгляда на документы кажется, что нужное поведение будет достигнуто путем выполнения socket.emit() вызовов внутри consume() обработчика канала.   -  person barry-johnson    schedule 25.03.2017
comment
@barry Извините за задержку, ваш ответ помог, но я могу понять после исправления проблемы. Спасибо   -  person empr    schedule 29.03.2017


Ответы (1)


В конце концов я исправил свою проблему, проблема в том, что я поместил функцию emit внутри события соединения, чтобы я мог получать данные, когда только установлено соединение, соединение устанавливается при загрузке страницы, поэтому я получаю данные только при загрузке страницы.

У меня есть следующий код для передачи данных

io.sockets.emit('новости/1', msg.content.toString());

person empr    schedule 29.03.2017