web-dev-qa-db-ja.com

socket.ioクライアントがサーバーからメッセージを受信しない

2つのクライアントを使用してシステムを実装しようとしています。1つはメッセージを送信し、もう1つはそれを受信します。以下の図は、それをより視覚的に説明しています。

socket.io message communication chart

したがって、クライアント1はメッセージをサーバーに送信し(これは機能します)、サーバーは「プッシュ」メッセージを受信し、クライアント2がピックアップする「ポップ」メッセージを送信します。ここでの問題は、クライアント2が受信しないことです。 「ポップ」メッセージ。 :(

これらすべてのコードは次のとおりです。

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>

CLIENT 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が「ポップ」メッセージを受信しない理由を理解できません。私は一般的にsocket.ioとnode.jsにかなり慣れていないので、一部のメカニズムはまだ少しあいまいなので、事前に謝罪します私の初心者。 :)

乾杯

-k-

30
holographix

.onに渡される関数は、初期化(バインディングイベントなど)を行うために各ソケットに対して呼び出され、socketはその現在のソケットを参照します。ハンドラー関数はそのPushイベントのPushイベントにバインドされているため、socketメッセージを受信すると、これはクライアント1になります-クライアント1が接続したときにその関数をバインドしました(ここで、socketはクライアントを指します1)。

io.socketsは、接続されているすべてのソケットを指しているため、クライアント2も含まれます。

17
pimvdb

あなたが考慮に入れることができるもう一つの側面はの使用です:

socket.broadcast.emit('Push', { hello: 'world' });

これは本質的に、メッセージを発信したクライアントを除く、接続されているすべてのクライアントにメッセージを送信します。クライアントをフィルタリングするタスクの削除/元のソケットへの不要なトラフィックの削減。

GitHubのSocket.IO -ブロードキャスト中。

14
cillierscharl