socket.io客户端无法从服务器接收消息

39

我正在尝试实现一个系统,其中有两个客户端,其中一个发送消息,另一个接收它。

下面的图表可以更直观地解释:

socket.io message communication chart

因此,客户端1将消息发送到服务器(这部分已经成功),服务器收到“push”消息并发出一个“pop”消息,这应该被客户端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' });
    });
});

客户端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一般还很新,所以一些机制对我来说仍然有些模糊,提前为我的初学者而道歉。:)

干杯

-k-


1
我对socket.io没有经验,但如果我没有错的话,socket将指向您收到消息的同一套接字。您可以尝试使用io.sockets.emit代替吗? - pimvdb
非常好用!如果您想回答,我可以将其标记为正确并给您一个+1 :) - holographix
6
一个有趣问题的提问方式和格式值得点赞。+1 - beny23
谢谢,我很高兴它对其他人有帮助 :) - holographix
2个回答

22
传递给.on的函数会为每个socket执行初始化(绑定事件等),socket指的是当前的socket。当接收到push消息时,它将是客户端1,因为处理程序函数绑定到该socketpush事件-在客户端1连接时绑定了该函数(其中socket指的是客户端1)。 io.sockets指的是所有连接的sockets,所以也包括你的情况下的客户机2。

我不明白,什么像魔法一样起作用了?哪里进行了编辑? - Ayyash
这只是一个解释,以消除socketio.sockets之间的混淆。 - Libby Lebyane

19
另一个需要考虑的方面是使用以下代码:socket.broadcast.emit('push', { hello: 'world' });,它将消息发送给除了发起消息的客户端以外的所有连接的客户端。这样可以避免过多的流量和对原始套接字过滤客户端的任务。
有关广播的更多信息,请访问GitHub上的Socket.IO

这也很有趣,但现在我需要跟踪我的客户并将消息传递给确定的客户,所以我已经找到了另一个解决方案,但这对未来可能会有用,谢谢! - holographix
先生,您应该得到一个点赞。在我尝试了8个小时却毫无结果之后,它对我非常有效! - mozcelikors

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