在 socket.io 中发出不工作

Posted

技术标签:

【中文标题】在 socket.io 中发出不工作【英文标题】:emit in socket.io not working 【发布时间】:2014-01-19 01:49:56 【问题描述】:

我创建了一个相当简单的 socket.io 项目来证明“sockets.emit”似乎有问题。

我在这里创建了一个 git:https://github.com/dirkk0/minimalsocket

有问题的行是 https://github.com/dirkk0/minimalsocket/blob/master/server.js#l17-21

    // this should work but doesn't
    io.sockets.emit(JSON.stringify(msg))

这不起作用。

因此,作为一种工作方法,我遍历客户端以发送消息,效果很好:

    io.sockets.clients().forEach(function (socket) 
        socket.send(JSON.stringify(msg));
    );

我在带有节点 v0.10.24、npm 1.3.21、socket.io 0.9.16、express 3.4.7 的 Ubuntu 12.04 和带有节点 0.10.12 的 MacOSX 上进行了测试。还有 Safari、Firefox、MacOSX 上的 Chrome 和 Windows7 上的 Chrome。 结果是一致的。

我是否忽略了一些明显的东西?

谢谢, 德克

编辑:是的,我忽略了我必须为频道命名(由于某种原因,.send 不需要该名称),例如: io.sockets.emit('message', JSON.stringify(msg)) socket.emit 没有损坏。

【问题讨论】:

好的存储库和自述文件:) doesn't work 是什么意思?就像没有发送消息,还是发送空消息?此外,您可能会发现这个问题相关:***.com/questions/11498508/socket-emit-vs-socket-send 你试过 io.sockets.emit('message', JSON.stringify(msg)) @damphat 是对的:emit 的第一个参数应该是消息名称。您使用 JSON 字符串作为名称,这本身并没有错(它会被发出),但我怀疑您是否在客户端监听该确切字符串。 是的,是的。在我将其更改为 'io.sockets.emit('message', JSON.stringify(msg))' 后,它起作用了。 @damphat 如果您想为此收集积分,请添加答案,我很乐意接受。感谢(也感谢您的第一条评论 :-) 和其他人)! 【参考方案1】:

您忘记了emit() 的事件名称,应为io.sockets.emit('message', yourObject) 或将其更改为io.sockets.send(yourObject)

emit()send() 的语法:

// @param yourEventName is a string
// @param yourObject is an serializable object (that mean you can stringify it)
socket.emit(yourEventName, yourObject);

// @param yourObject is a serializable object
socket.send(yourObject) // equipvalent to socket.emit('message', yourObject) (???) 

【讨论】:

如果服务器没有发出,是否可以获得回调的值?

以上是关于在 socket.io 中发出不工作的主要内容,如果未能解决你的问题,请参考以下文章

当接收器离线时,socket.io 发出不工作

Socket.io 未能发出函数

如何在 Express 4 路由中使用 socket.io 向连接的套接字发出事件?

socket.io 发出不接收消息的原因?

Socket.io 在 Node.js + Redis + Heroku(多个测功机)环境中发出并不总是收到

在 Android 上发出 socket.io 消息