io.of('namespace')。emit('event',message)在socket.io中不使用namespace

时间:2014-05-20 08:10:33

标签: node.js 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')指定命名空间时,发出'它'不起作用,为什么?

我的客户方是:

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);
//});

1 个答案:

答案 0 :(得分:10)

您的代码或多或少都很好,但您使用的是不同的命名空间。

io.sockets.emit()向当前通过套接字连接到服务器的所有人广播。这就是它起作用的原因。从技术上讲,这是因为io.of('').emit()''是命名空间)的“捷径”。

假设您要使用/hello命名空间,这就是您必须在客户端上执行的操作:

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: How to usesocket.io rooms on 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');
});

......它奏效了。我从here复制了jquery-ajax代码。