node.js + socket.io – 重复的websocket写入?

我是新来的node.js和socket.io场景,所以这可能是一个简单的解决scheme…但在这里。 我有以下POC通过UDP接收消息并将其回显给浏览器。 在55555上接收UDP消息,执行websocket写入,并且客户端在浏览器中看到数据。 但是,当另一个客户端连接到服务器时,在收到数据报时会执行四个websocket写入 – 每个客户端有两个我相信,因为附加数据现在显示两次 。 创build第三个客户端显示了六个websocket写入 – 附加数据现在出现三次。

任何想法是什么造成这个? 愚蠢的错误? 误读? 错误?

服务器:

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输出,显示第一个客户端连接后发送的数据,第二个连接后:

 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"]} 

据我所知,没有节点进行testing; 只要客户端没有发送任何你需要处理的数据,你对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消息callback。 回拨广播到所有的客户端,这意味着当第二个客户端连接时,所有客户端将发生2次所有广播,所有客户端发送3次客户端3次。您只需要设置UDP消息处理器一次,因为它广播无论如何所有连接的客户。