io.of ('namespace'). emit ('event', message) не работает с пространством имен в socket.io

У меня есть приложение, подобное этому:

io.of('/hello').on('connection', function(socket) {
    socket.emit('world', {});
});

app.post('/', function *(next) {
    console.log("At here......");
    var pushMessage = (yield parse.json(this));
    console.log(pushMessage);
    if(flag !== 0) {
//        io.of('/hello/').emit('world', pushMessage);
        io.sockets.emit('world', pushMessage);
    } else {
        console.log("Do Nothing");
    }
});

Он получает запрос http и отправляет событие. Когда я использую io.sockets.emit, он работает хорошо, но когда я указываю пространство имен с помощью 'io.of (' hello '). Emit', это не работает, почему?

Моя клиентская сторона это:

var socket = io.connect('http://localhost:3000', {
  'reconnection delay': 100,
  'reconnection limit': 100,
  'max reconnection attempts': 10
});
//server side use io.sockets.emit
socket.on('world', function(data) {
  alert(data.a);
});

//if server side use io.of('/hello/').emit
//socket.of('/hello/').on('world', function(data) {
//  alert(data.a);
//});
 AriesDevil20 мая 2014 г., 10:51
@ BenFortune Я добавляю это
 Ben Fortune20 мая 2014 г., 10:33
Как выглядит ваш клиентский код?

Ответы на вопрос(1)

Решение Вопроса

но вы находитесь в разных пространствах имен.

io.sockets.emit() передает всем, кто в данный момент подключен к вашему серверу через сокет. Вот почему это работает. Технически это потому, что это «ярлык» дляio.of('').emit() ('' будучи пространством имен).

Предполагая, что вы собираетесь использовать/hello namespace, это то, что вы должны сделать на своем клиенте:

var socket = io.connect('http://localhost:3000/hello'); // your namespace is /hello

на сервере вы сначала должны прослушать соединения в этом пространстве имен:

io.of('/hello').on('connection', function(socket) {
  socket.emit('world', { a: 'hi world' });
});

затем:

io.of('/hello').emit('something');

Вы можете посмотреть на это:socket.io: как использовать а такжекомнаты socket.io на GitHub

### ОБНОВИТЬ ###

Я провел небольшой тест:

клиент:

$('document').ready(function() {
  var socket = io.connect("localhost:3000/hello");

  socket.on('hello', function() {
    console.log('hello received');
  });

  var data = {};
  data.title = "title";
  data.message = "message";

  setTimeout(function() {
    $.ajax({
      type: 'POST',
      data: JSON.stringify(data),
      contentType: 'application/json',
      url: 'http://localhost:3000/hello',
      success: function(data) {
        console.log('success');
        console.log(JSON.stringify(data));
      }
    });
   }, 2000);
});

сервер:

io.of('/hello').on('connection', function() {
  console.log("client connected");
});

app.post('/hello', function(req, res) {
  io.of('/hello').emit('hello');
});

... и это сработало. Я скопировал код jquery-ajax изВот.

 AriesDevil22 мая 2014 г., 04:55
Это просто работает сейчас :) Большое спасибо!
 AriesDevil21 мая 2014 г., 11:28
Я использую ваш обновленный ответ, но, к сожалению, он все еще не работает. См. Мой обновленный ответ. Мое требование - когда я принимаю запрос http, я посылаю событие, а клиент прослушивает это событие и отображает данные.
 Sphygmomanometer21 мая 2014 г., 14:56
@AriesDevil: я обновил свой ответ еще раз кодом моего маленького локального теста. Надеюсь, поможет.
 Joe Walker19 окт. 2016 г., 18:56
зачем вам перебирать ajax, чтобы поймать ответ, это нарушает все назначение socket.io - отправлять события для подачи данных, если вы собираетесь использовать интервал, сделайте это с сервера, чтобы вы могли проверить отправку данных ,
 Sphygmomanometer21 мая 2014 г., 09:34
@AriesDevil: Это весь твой код? Я подозреваю, что вы нигде не прослушиваете соединения в этом пространстве имен. Смотрите мой обновленный ответ.
 Sphygmomanometer14 мар. 2017 г., 10:03
@ Джо Уокер: Я не совсем уверен, что вы имеете в виду. OP сказал, что он получает HTTP-запрос и впоследствии попытался выполнить передачу в пространство имен. Это именно то, что я сделал. Я использовал таймаут только для задержки HTTP-запроса и события сокетаявляется исходя из сервера.
 AriesDevil21 мая 2014 г., 07:39
Я пытаюсь это, но это все еще не работает

Ваш ответ на вопрос