我是node.js和socket.io场景的新手,所以这可能是一个简单的修复......但是这里有。我有以下POC通过UDP接收消息并将它们回显给浏览器。在55555上接收UDP消息,执行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"]}
答案 0 :(得分: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次到所有客户端,3个客户端发生3次到所有客户端等。您只想设置UDP消息处理程序一次,因为它无论如何都会广播到所有连接的客户端。