158

这两者有什么区别?

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

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

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

4

6 回答 6

141

使用 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);
});
于 2012-07-16T08:11:45.497 回答
117

简单而精确(来源:Socket.IO google group):

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

socket.send发送与'message'事件一起接收的消息

于 2012-12-07T17:04:25.063 回答
50

TL;博士:

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
    }));
}
于 2013-11-15T22:25:53.050 回答
29

socket.send实现与 vanilla WebSocket 接口的兼容性。socket.emit只是 Socket.IO 的功能。它们都做同样的事情,但socket.emit在处理消息时更方便一些。

于 2012-11-22T22:17:14.033 回答
0

https://socket.io/docs/client-api/#socket-send-args-ack

socket.send// 发送消息事件

socket.emit(eventName[, ...args][, ack])// 你可以自定义事件名称

于 2018-04-10T03:34:53.873 回答
0

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

于 2016-09-23T12:39:23.387 回答