socket.emit()与socket.send()

这两者有什么区别?

我注意到,如果我从一个工作程序中的socket.send更改为socket.emit ,服务器无法收到消息,但我不明白为什么。

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

为什么这种行为? 你怎么知道什么时候使用socket.emitsocket.send

随着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也是这样做的,但是你不需要注册'news',而是要注意:

服务器:

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

简单而精确(来源: Socket.IO谷歌组 ):

socket.emit允许您在服务器和客户端上发出自定义事件

socket.send发送与“消息”事件一起收到的消息

TL; DR:

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

不看源代码,我会假设发送函数更有效的编辑:至less发送string消息

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

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

socket.send实现与vanilla WebSocket接口的兼容性。 socket.emit只是socket.emit的function。 它们都是一样的,但是socket.emit在处理消息方面更加方便。

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