2

私は node.js と socket.io のシーンに慣れていないので、これは簡単な修正かもしれません... しかし、ここに行きます。UDP経由でメッセージを取り込み、ブラウザにエコーバックするための次のPOCがあります。UDP メッセージは 55555 で受信され、websocket 書き込みが実行され、クライアントはブラウザーでデータを確認します。ただし、別のクライアントがサーバーに接続した瞬間、データグラムを受信したときに 4 つの websocket 書き込みが実行されます。追加されたデータが 2 回表示されるようになったため、各クライアントに2 回です。3 番目のクライアントを起動すると、6 つの Websocket 書き込みが表示され、追加されたデータが 3 回表示されます。

これを引き起こしているアイデアはありますか?ダムエラー?誤解?バグ?

サーバ:

var dgram = require("dgram");
var udpserver = dgram.createSocket("udp4");
udpserver.bind(55555);  //udp listener

var express = require("express");
var app = express();
var http = require('http');
var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(12345);  //tcp http listener

io.sockets.on('connection', function (socket) {
    udpserver.on('message', function (msg, rinfo) {
            io.sockets.emit('update', msg.toString());
    });
});

クライアント:

<!DOCTYPE HTML>
<script src="http://code.jquery.com/jquery-1.8.1.min.js"></script>
<script src="http://localhost:12345/socket.io/socket.io.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        var socket = new io.connect('http://localhost:12345');
        socket.on('update', function (data) {
            $("#stuff").append(data + "<br>");
        });
     });
</script>
<div id=stuff></div>
</html>

node最初のクライアントが接続した後、および 2 番目のクライアントが接続した後に送信されたデータを示す出力を次に示します。

info  - socket.io started
debug - served static content /socket.io.js
debug - client authorized
info  - handshake authorized xrMZtzv9HPSngRYzMibw
debug - setting request GET /socket.io/1/websocket/xrMZtzv9HPSngRYzMibw
debug - set heartbeat interval for client xrMZtzv9HPSngRYzMibw
debug - client authorized for
debug - websocket writing 1::
debug - websocket writing 5:::{"name":"update","args":["test1\n"]}
debug - emitting heartbeat for client xrMZtzv9HPSngRYzMibw
debug - websocket writing 2::
debug - set heartbeat timeout for client xrMZtzv9HPSngRYzMibw
debug - got heartbeat packet
debug - cleared heartbeat timeout for client xrMZtzv9HPSngRYzMibw
debug - set heartbeat interval for client xrMZtzv9HPSngRYzMibw
debug - served static content /socket.io.js
debug - client authorized
info  - handshake authorized VJKxI4y8TV9tcYjEMibx
debug - setting request GET /socket.io/1/websocket/VJKxI4y8TV9tcYjEMibx
debug - set heartbeat interval for client VJKxI4y8TV9tcYjEMibx
debug - client authorized for
debug - websocket writing 1::
debug - websocket writing 5:::{"name":"update","args":["test1\n"]}
debug - websocket writing 5:::{"name":"update","args":["test1\n"]}
debug - websocket writing 5:::{"name":"update","args":["test1\n"]}
debug - websocket writing 5:::{"name":"update","args":["test1\n"]}
4

1 に答える 1

3

テストするノードがなくてもわかる限り。クライアントが処理する必要のあるデータを送信しない限り、socket.io 接続イベントで何かをすることにあまり興味がないので、それらを無視できるはずです。必要なのは、UDP イベントを受信し、その時点で接続されているすべてのクライアントにブロードキャストすることだけです。これは次のように単純にする必要があります。

...
var io = require('socket.io').listen(server);
server.listen(12345);  //tcp http listener

udpserver.on('message', function (msg, rinfo) {
    io.sockets.emit('update', msg.toString());
});

完全を期すために。現在のコードで行っていることは、新しい socket.io 接続ごとに新しい UDP メッセージ コールバックを追加することです。コールバックはすべてのクライアントにブロードキャストします。つまり、2 番目のクライアントが接続すると、すべてのブロードキャストがすべてのクライアントに 2、3 つのクライアントの場合はすべてのクライアントに 3 回発生します。とにかく、接続されているすべてのクライアントに。

于 2012-09-12T16:26:52.127 に答える