2013-04-24 31 views
5

Tôi mới sử dụng node.js, vì vậy hãy tha thứ cho sự thiếu hiểu biết nếu điều này là đơn giản.node.js nghe UDP và chuyển tiếp tới máy khách web http được kết nối

Điều tôi muốn làm là thiết lập máy chủ http node.js đơn giản mà máy khách web kết nối. Tôi cũng muốn máy chủ node.js hoạt động như một trình nghe UDP trên một cổng riêng biệt, trên đó nó sẽ nhận các tải trọng JSON từ một số ứng dụng khác. Tôi muốn máy chủ node.js chuyển tiếp các tải trọng JSON này ngay lập tức cho một hoặc nhiều máy khách web được kết nối.

tôi nhận này xa một số googling ban đầu xung quanh:

  1. Tạo một máy chủ http Node.js đơn giản mà đáp lại với một trang html tĩnh:

    //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. Khởi tạo một máy chủ UDP trên một cổng riêng biệt:

    //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. Sử dụng socket.io để estab lish một kết nối trực tiếp giữa web-client và server:

    //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); 
        } 
    ); 
    }); 
    

Tôi đoán vấn đề của tôi là tôi không biết làm thế nào để thu hẹp 2 và 3, để có được các gói tin UDP nhận phát sóng vào ổ cắm kết nối. io khách hàng. Hoặc có lẽ có một cách đơn giản hơn, thanh lịch hơn để làm điều này? Tôi tìm thấy tài liệu cho socket.io được thiếu ...

EDIT: nhờ vào người đó cố định mã định dạng

Trả lời

10

tôi đã thực hiện một ví dụ chạy cho bạn để được đi với: http://runnable.com/UXsar5hEezgaAACJ

Bây giờ nó chỉ là một máy khách loopback -> socket.io -> udp client -> udp server -> socket.io -> client.

đây là cốt lõi của nó:

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

Thanks, điều này đã giúp tôi đạt được chỉ là những gì tôi muốn :) – kufudo

+0

@generalhenry Bạn có thể sửa chữa lên mã trên [Runnable] (http://runnable.com/ UXsar5hEezgaAACJ), vì tôi cần xem cách bạn đang truyền dữ liệu 'UDP' trên máy chủ này? Và về những gì 'cổng'? – Ravi

+0

udp nằm trên một cổng có sẵn ngẫu nhiên (là mặc định nếu bạn không chỉ định vị trí để liên kết). Sau đó, tôi xử lý nó bằng cách sử dụng srv.address() trả về chi tiết địa chỉ. (sửa chữa runnable comming) – generalhenry

Các vấn đề liên quan