node.js侦听UDP并转发到已连接的http Web客户端
问题描述:
我是node.js的新手,如果这很简单,请原谅无知。node.js侦听UDP并转发到已连接的http Web客户端
我想要做的是设置一个简单的node.js http服务器,Web客户端连接到该服务器。我还希望node.js服务器在单独的端口上充当UDP侦听器,在其上将从其他应用程序接收JSON有效内容。我想让node.js服务器立即将这些JSON负载转发给一个或多个连接的Web客户端。
我得到这个远离周围的一些最初的谷歌搜索:
-
创建一个静态的HTML页面响应一个简单的node.js的http服务器:
//Initialize the HTTP server on port 8080, serve the index.html page var server = http.createServer(function(req, res) { res.writeHead(200, { 'Content-type': 'text/html'}); res.end(fs.readFileSync(__dirname + '/index.html')); }).listen(8080, function() { console.log('Listening at: 127.0.0.1 8080'); } );
-
初始化一个UDP服务器一个单独的端口:
//Initialize a UDP server to listen for json payloads on port 3333 var srv = dgram.createSocket("udp4"); srv.on("message", function (msg, rinfo) { console.log("server got: " + msg + " from " + rinfo.address + ":" + rinfo.port); io.sockets.broadcast.emit('message', 'test'); //stream.write(msg); //socket.broadcast.emit('message',msg); }); srv.on("listening", function() { var address = srv.address(); console.log("server listening " + address.address + ":" + address.port); }); srv.bind(5555);
-
使用socket.io来建立中国语Web的客户端和服务器之间的实时连接:
//this listens for socket messages from the client and broadcasts to all other clients var io = require('socket.io').listen(server); io.sockets.on('connection', function (socket) { socket.on('message', function (msg) { console.log('Message Received: ', msg.data.skeletons[0] ? msg.data.skeletons[0].skeleton_id : ''); socket.broadcast.emit('message', msg); } ); });
我想我的问题是我不知道如何弥合2和3,获得广播给所连接的插座所接收到的UDP数据包。 io客户。或者也许有一个更简单,更优雅的做法呢?我发现有所欠缺socket.io文档...
编辑:多亏了固定代码格式
答
我做了一个运行的例子,你得到与去的人:http://runnable.com/UXsar5hEezgaAACJ
现在它只是一个回送客户端 - > socket.io - > udp客户端 - > udp服务器 - > socket.io - >客户端。
这里是它的核心:
var http = require('http');
var fs = require('fs');
var html = fs.readFileSync(__dirname + '/index.html');
//Initialize the HTTP server on port 8080, serve the index.html page
var server = http.createServer(function(req, res) {
res.writeHead(200, {
'Content-type': 'text/html'
});
res.end(html);
}).listen(process.env.OPENSHIFT_NODEJS_PORT, process.env.OPENSHIFT_NODEJS_IP, function() {
console.log('Listening');
});
var io = require('socket.io').listen(server);
io.set('log level', 0);
io.sockets.on('connection', function (socket) {
socket.emit('message', 'connected');
socket.on('message', function (data) {
console.log(data);
var address = srv.address();
var client = dgram.createSocket("udp4");
var message = new Buffer(data);
client.send(message, 0, message.length, address.port, address.address, function(err, bytes) {
client.close();
});
});
});
var dgram = require('dgram');
//Initialize a UDP server to listen for json payloads on port 3333
var srv = dgram.createSocket("udp4");
srv.on("message", function (msg, rinfo) {
console.log("server got: " + msg + " from " + rinfo.address + ":" + rinfo.port);
io.sockets.emit('message', 'udp');
});
srv.on("listening", function() {
var address = srv.address();
console.log("server listening " + address.address + ":" + address.port);
});
srv.on('error', function (err) {
console.error(err);
process.exit(0);
});
srv.bind();
谢谢你,帮我实现正是我想要:) – kufudo 2013-04-28 09:18:20
@generalhenry你能修复了上[可运行(http://runnable.com/代码UXsar5hEezgaAACJ),因为我需要看看你如何在这台服务器上传输UDP数据?和什么'端口'? – Ravi 2014-11-29 10:38:43
udp位于随机可用的端口上(如果您不指定要绑定的位置,则默认为默认端口)然后使用srv.address()对其进行寻址,该函数返回地址详细信息。 (可运行的修复程序) – generalhenry 2014-11-30 19:09:01