socket.emit()与socket.send()


133

两者之间有什么区别?

我注意到,如果在工作程序中从更改socket.emitsocket.send,则服务器无法接收到该消息,尽管我不明白为什么。

我还注意到,在我的程序中,如果我从更改socket.emitsocket.send,则服务器会收到一条消息,但似乎多次收到。当我console.log()用来查看服务器收到了什么时,它显示的内容与我使用时的有所不同socket.emit

为什么会这样呢?您怎么知道何时使用socket.emitsocket.send

Answers:


123

使用socket.emit,您可以像这样注册自定义事件:

服务器:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

客户:

var socket = io.connect('http://localhost');
socket.on('news', function (data) {
  console.log(data);
  socket.emit('my other event', { my: 'data' });
});

Socket.send的作用相同,但您不是向“新闻”注册而是向消息发送:

服务器:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.send('hi');
});

客户:

var socket = io.connect('http://localhost');
socket.on('message', function (message) {
  console.log(message);
});

3
似乎没有太大的区别。看起来socket.emit()可以完成socket.on()可以做的所有事情。他们为什么必须行使该职能?
节点忍者

2
我不知道,我检查了源代码,它们几乎相同(github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318)。也许这是历史的,只是为了向后兼容。
查尔斯

37
还要注意,这篇文章的未来读者会说这是关于socket.io的,而不是关于node.js的TCP,UDP或Unix套接字的。
aredridel

3
是否可以使用香草javascript Websocket发出消息?
亚历克斯·布兹尼克

11
貌似socket.send是单纯只是一个别名socket.emit('message', message);
莫希特Gangrade


45

TL; DR:

socket.send(data, callback) 本质上等同于调用 socket.emit('message', JSON.stringify(data), callback)

如果不看源代码,我会假设send函数的编辑效率更高:对于发送字符串消息,至少

所以是的,基本上,emit允许您发送对象,这非常方便。

通过以下示例socket.emit

sendMessage: function(type, message) {
    socket.emit('message', {
        type: type,
        message: message
    });
}

对于那些在家中保持得分的人来说,使用socket.send以下代码是这样的:

sendMessage: function(type, message) {
    socket.send(JSON.stringify({
        type: type,
        message: message
    }));
}

27

socket.send实现与Vanilla WebSocket接口的兼容性。socket.emit仅是Socket.IO的功能。它们都执行相同的操作,但是socket.emit在处理消息时更为方便。


socket.emit不仅限于Socket.IO,还可以在网络上运行。
2014年

0

在基本的双向通信系统中,socket.emit已被证明更具有说服力且易于使用(个人经验),并且是Socket.IO的一部分,而Socket.IO正是为此目的而构建的


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.