socket.emit()与socket.send()

nod*_*nja 126 sockets node.js socket.io

这两者有什么区别?

我注意到,如果我从改变socket.emitsocket.send在一个工作程序,服务器无法接收消息,虽然我不明白为什么.

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

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

Cha*_*les 115

使用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);
  });
});
Run Code Online (Sandbox Code Playgroud)

客户:

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

Socket.send也是如此,但你没有注册到'news'而是注册消息:

服务器:

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

io.sockets.on('connection', function (socket) {
  socket.send('hi');
});
Run Code Online (Sandbox Code Playgroud)

客户:

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

  • 还要注意,这篇文章的未来读者,这是关于socket.io,而不是node.js TCP,UDP或Unix套接字. (34认同)
  • 看起来`socket.send`只是`socket.emit('message',message);`的别名 (8认同)
  • 是否可以使用vanilla javascript Websockets发出声音? (3认同)
  • 这似乎不是一个很大的区别.它看起来像socket.emit()可以执行socket.on()所能做的一切.他们为什么要做这个功能? (2认同)
  • 我不知道,我检查了源代码,它们几乎相同(https://github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318).也许这是历史性的,只是为了向后兼容. (2认同)

M.D*_*.D. 85

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

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

socket.send发送随'message'事件一起收到的消息


Kyl*_*hay 45

TL; DR:

socket.send(data, callback) 基本上相当于调用 socket.emit('message', JSON.stringify(data), callback)

不看源代码,我会假设send函数更有效编辑:至少发送字符串消息

所以是的,基本上发射允许你发送物体,这是非常方便的.

以下为例socket.emit:

sendMessage: function(type, message) {
    socket.emit('message', {
        type: type,
        message: message
    });
}
Run Code Online (Sandbox Code Playgroud)

而对于那些在家里得分的人来说,这就是它的用途socket.send:

sendMessage: function(type, message) {
    socket.send(JSON.stringify({
        type: type,
        message: message
    }));
}
Run Code Online (Sandbox Code Playgroud)


art*_*tch 26

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