socket.emit()与socket.send()的区别

173

这两者有什么区别?

我注意到,在一个工作中的程序中,如果我将 socket.emit 更改为 socket.send ,那么服务器将无法接收到消息,尽管我不明白原因。

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

为什么会出现这种行为?如何知道何时使用socket.emitsocket.send


另外,请注意,这篇文章是关于 socket.io,而不是关于 node.js 的 TCP、UDP或Unix套接字。 - Coder Gautam YT
7个回答

149
使用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”事件名称,而是注册到message事件上:
服务器:
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()的所有功能。为什么还要创建那个函数? - node ninja
2
我不知道,但我查看了源代码,它们几乎相同(https://github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318)。也许这是历史原因,只是为了向后兼容。 - Charles
1
socket.io让emit()做的不同于EventEmitter的emit()的事情,真是令人费解,不是吗?它是在原始伪套接字的基础上建立的一种协议,在远程的另一侧以命名事件的形式出现,而不是原始的消息。它允许您使用单个套接字来处理多个流,从某种意义上来说,实现了多路复用。 - aredridel
44
请注意,未来阅读本帖的读者,这篇文章是关于socket.io,而不是node.js的TCP、UDP或Unix sockets。 - aredridel
4
能否使用纯JavaScript Websockets发送消息? - Alex Buznik
14
似乎socket.send只是socket.emit('message', message);的别名。 - Mohit Gangrade

124

简单明了(来源:Socket.IO google group):

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

socket.send 发送消息,这些消息会通过 'message' 事件接收到。


50

简而言之:

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

28

socket.send 是为了兼容原始 WebSocket 接口而实现的。而 socket.emit 是 Socket.IO 特有的功能。它们都可以用于发送消息,但是 socket.emit 更方便处理消息。


socket.emit 不仅限于 Socket.IO,也适用于 net。 - Ajay
不仅限于 Socket.io。请查看 ws:https://github.com/websockets/ws#sending-and-receiving-text-data - AlxVallejo

0
在基本的双向通信系统中,socket.emit已被证明更具有说服力和易于使用(个人经验),并且是Socket.IO的一部分,该库主要用于此类目的。

0

0

更新v4.x

根据官方文档:

socket.send - 发送一个message事件。可以像这样使用:

// Client side
socket.send('hello')

// Server side
socket.on('message', (data) => {
   console.log(data) // hello
})

socket.emit - 发送一个自定义事件。使用方法如下:

// Client side
socket.emit('hello', 'rick')

// Server side
socket.on('hello', (name) => {
   console.log(name) // rick
})

我个人建议使用socket.emit,因为它更简单易懂,而且可以保持一致性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接