Node.js的+ socket.io - 复制的WebSocket写?(node.js + so

2019-06-28 07:17发布

我是新来的Node.js和受socket.io的场景,所以这可能是一个简单的修复......但在这里不用。 我对通过UDP采取的消息,并呼应他们回到浏览器下面的POC。 UDP消息收到55555,进行WebSocket的写入,并在客户端看到在其浏览器中的数据。 然而,另一种客户端连接到服务器的那一刻,四次WebSocket的写操作被执行接收到一个数据包时-两到每一个客户,我相信,作为附加的数据现在显示了两次 。 发射了第三个客户端说明了六个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"]}

Answer 1:

至于我可以不必节点上测试告诉; 你不是只要客户端不发送你需要处理的所有数据上做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());
});

只是为了保持完整性; 你目前的代码确实是增加一个新的UDP消息回调为每个新socket.io连接。 回调广播到所有的客户端,这意味着当第二个客户端连接,所有广播会发生2次到所有客户端,3个客户3次到所有客户端等,你只需要设置UDP消息处理过一次 ,因为它播放反正所有连接的客户端。



文章来源: node.js + socket.io - duplicate websocket writes?