【问题标题】:io.of('namespace').emit('event', message) not working with namespace in socket.ioio.of('namespace').emit('event', message) 不适用于 socket.io 中的命名空间
【发布时间】:2016-07-05 08:21:50
【问题描述】:

我有一个这样的应用程序:

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

【问题讨论】:

  • 你的客户端代码是什么样的?

标签: node.js socket.io


【解决方案1】:

您的代码或多或少都很好,但您位于不同的命名空间。

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 代码。

【讨论】:

  • @AriesDevil:这是你的全部代码吗?我怀疑您没有在任何地方侦听该名称空间上的连接。请参阅我的更新答案。
  • 我使用了您更新的答案,但不幸的是它仍然无法正常工作。请参阅我更新的答案。我的要求是当我接受 http 请求时,我会发出一个事件,客户端会监听此事件并显示数据。跨度>
  • @AriesDevil:我再次使用本地小测试的代码更新了我的答案。希望对您有所帮助。
  • 为什么要使用 ajax 进行迭代以捕获响应,这破坏了 socket.io 的所有目的,即发出事件以提供数据,如果您要使用间隔从服务器执行它所以你可以测试数据的发射。
  • @Joe Walker:我不太确定你的意思。 OP 说他正在接收一个 HTTP 请求,随后尝试向命名空间发出。这正是我所做的。我只使用超时来延迟 HTTP 请求和套接字事件 is 来自服务器。
猜你喜欢
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2011-08-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多