我正在尝试使用两个客户端实现一个系统,其中一个客户端发送一条消息而另一个客户端将接收该消息。 下图将以更直观的方式解释它:
因此,客户端1将消息发送到服务器(并且这有效),服务器接收“推送”消息并发出应该由客户端2接收的“弹出”消息。 这里的问题是客户端2从未收到“pop”消息。 :(
以下是所有这些代码。
SERVER.JS
var app = require('express').createServer()
, io = require('socket.io').listen(app);
app.listen(999);
app.get('/webclient', function (req, res) {
res.sendfile(__dirname + '/web.html');
});
app.get('/mobile', function (req, res) {
res.sendfile(__dirname + '/mobile.html');
});
io.sockets.on('connection', function (socket) {
// socket.emit('pop', { hello: 'world' });
socket.on('push', function (data) {
console.log('push received, emitting a pop');
socket.emit('pop', { hello: 'world' });
});
});
CLIENT 1(又名mobile.html)
<html>
<head>
<title>
Mobile
</title>
<script src="/socket.io/socket.io.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed.js" type="text/javascript"></script>
<script>
var socket = io.connect('http://localhost:999');
</script>
</head>
<body>
<input type="button" name="act" id="push" value="message" />
<script type="text/javascript" charset="utf-8">
window.addEvent('domready', function() {
$('push').addEvent('click', function() {
socket.emit('push', { hello: 'world' });
});
});
</script>
</body>
</html>
客户端2(又名web.html)
<script src = "/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:999');
socket.on('pop', function (data) {
console.log(data);
});
</script>
我无法理解客户端2没有收到“pop”消息的原因, 我对socket.io和node.js一般都很陌生,所以对我来说一些机制仍然有点模糊,所以我提前为我的noobness道歉。 :)
欢呼声
-k-
答案 0 :(得分:16)
为每个套接字调用传递给.on
的函数进行初始化(绑定事件等),socket
引用当前套接字。当您收到push
消息时,这将是客户端1,因为处理函数绑定到push
的{{1}}事件 - 当客户端1连接时绑定该函数(其中{{ 1}}指客户1)。
socket
指的是连接的所有套接字,因此在您的情况下包括客户端2。
答案 1 :(得分:14)
您可以考虑的另一个方面是使用:
socket.broadcast.emit('push', { hello: 'world' });
除了发起消息的客户端之外,其实质上将消息发送给所有连接的客户端。删除过滤客户端的任务/减少对原始套接字的不必要流量。
Socket.IO on GitHub - 在广播下。