2013-04-24 55 views
5

我是node.js的新手,如果這很簡單,請原諒無知。node.js偵聽UDP並轉發到已連接的http Web客戶端

我想要做的是設置一個簡單的node.js http服務器,Web客戶端連接到該服務器。我還希望node.js服務器在單獨的端口上充當UDP偵聽器,在其上將從其他應用程序接收JSON有效內容。我想讓node.js服務器立即將這些JSON負載轉發給一個或多個連接的Web客戶端。

我得到這個遠離周圍的一些最初的谷歌搜索:

  1. 創建一個靜態的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'); 
        } 
    ); 
    
  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數據包。 io客戶。或者也許有一個更簡單,更優雅的做法呢?我發現有所欠缺socket.io文檔...

編輯:多虧了固定代碼格式

回答

10

我做了一個運行的例子,你得到與去的人: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(); 
+0

謝謝你,幫我實現正是我想要:) – kufudo 2013-04-28 09:18:20

+0

@generalhenry你能修復了上[可運行(http://runnable.com/代碼UXsar5hEezgaAACJ),因爲我需要看看你如何在這臺服務器上傳輸UDP數據?和什麼'端口'? – Ravi 2014-11-29 10:38:43

+0

udp位於隨機可用的端口上(如果您不指定要綁定的位置,則默認爲默認端口)然後使用srv.address()對其進行尋址,該函數返回地址詳細信息。 (可運行的修復程序) – generalhenry 2014-11-30 19:09:01