【问题标题】:node.js listen for UDP and forward to connected http web clientsnode.js 侦听 UDP 并转发到连接的 http web 客户端
【发布时间】:2013-04-24 10:49:48
【问题描述】:

我是 node.js 的新手,如果这很简单,请原谅我的无知。

我想要做的是设置一个简单的 node.js http 服务器,一个 web 客户端连接到该服务器。我还希望 node.js 服务器充当单独端口上的 UDP 侦听器,在该端口上它将接收来自其他应用程序的 JSON 有效负载。我希望 node.js 服务器随后将这些 JSON 有效负载立即转发到一个或多个连接的 Web 客户端。

我从最初的谷歌搜索中得到了这个:

  1. 创建一个简单的 node.js http 服务器,以静态 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(fs.readFileSync(__dirname + '/index.html'));
        }).listen(8080, function() {
            console.log('Listening at: 127.0.0.1 8080');
        }
    );
    
  2. 在单独的端口上初始化 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);
    
  3. 使用 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 数据包广播到连接的 socket.io 客户端。或者也许有一种更简单、更优雅的方式来做到这一点?我发现缺少 socket.io 的文档...

编辑:感谢修复代码格式的人

【问题讨论】:

    标签: node.js websocket socket.io


    【解决方案1】:

    我为你做了一个运行示例: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();
    

    【讨论】:

    • 谢谢,这帮助我实现了我想要的:)
    • @generalhenry 你能修复runnable 上的代码吗,因为我想看看你是如何在这个服务器上传输UDP 数据的?在什么port
    • udp 位于随机可用端口上(如果您不指定绑定位置,这是默认端口)然后我使用 srv.address() 来解决它,它返回地址详细信息。 (runnable fix comming)
    • 嘿,你可能有代码吗?您之前的链接似乎已过期..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多