2012-07-16 84 views
88

这两者有什么区别?socket.emit()与socket.send()

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

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

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

回答

92

随着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); 
}); 
+2

这看起来不是很大的区别。它看起来像socket.emit()可以完成socket.on()所能做的所有事情。他们为什么要做这个功能? – 2012-07-19 23:20:15

+2

我不知道,我检查了源代码,他们几乎相同(https://github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318)。也许这是历史性的,只是为了向后兼容。 – Charles 2012-07-20 06:53:42

+1

socket.io的制作emit()做的事情不是EventEmitter的emit()做的事情是莫名其妙的,不是吗?这是一个在原始伪套接字之上的协议,它作为远端命名事件出现,而不是原始消息。它允许您为多个流使用单个套接字,从某种意义上说,可以将它们复用。 – aredridel 2012-11-25 16:38:31

20

socket.send被用于与香草WebSocket的接口的兼容性实现。 socket.emit是仅限于Socket.IO的功能。它们都是一样的,但是socket.emit在处理消息方面更加方便。

+0

socket.emit不限于Socket.IO,但也可以在网络上运行。 – ajay 2014-09-27 07:12:18

54

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

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

socket.send发送其与'message'事件

38

TL接收的消息; DR :

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

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

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

拿这个例子与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 
    })); 
} 
0

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

相关问题