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

标签 node.js websocket socket.io

我是node.js 和socket.io 场景的新手,所以这可能是一个简单的修复......但这里是。我有以下 POC,用于通过 UDP 接收消息并将它们回显回浏览器。在 55555 上接收 UDP 消息,执行 Websocket 写入,客户端在浏览器中看到数据。然而,当另一个客户端连接到服务器时,收到数据报时会执行四次 Websocket 写入 - 我相信每个客户端都会执行两次,因为附加数据现在显示两次。启动第三个客户端显示 6 次 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"]}

最佳答案

据我所知,没有 Node 可以测试;只要客户端不发送您需要处理的任何数据,您就不会对在 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次,对于3个客户端将在所有客户端上发生3次等等。您只需设置UDP消息处理程序启动一次,因为它无论如何都会广播到所有连接的客户端。

关于node.js + socket.io - 重复的 websocket 写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12392316/

相关文章:

javascript - 在 Waterline 中动态定义和获取模型

tomcat - Play WebSockets 不适用于 Apache Tomcat

socket.io - 无法连接 Treeline 上的套接字

javascript - HTML5 websocket 客户端未检测到服务器意外断开连接

node.js - 在 node.js + socket.io 中为房间设置变量

node.js - 套接字.io : associate browser and computer with the connection

php - 与使用 PHP 等为移动应用程序创建的普通 API 相比,将 Node.js 用于 API 有什么好处吗?

node.js - 获取满足查询条件的文档 ID

windows - Express 的 Node 包管理器安装错误

websocket - 如何使 websocket 流广播到许多其他页面?