2013-04-24 6 views
5

Я новичок в node.js, поэтому прощайте невежество, если это просто.node.js прослушивает UDP и пересылает подключенные http-клиенты сети

Что я хочу сделать, это настроить простой HTTP-узел node.js, к которому подключается веб-клиент. Я также хочу, чтобы сервер node.js выступал в качестве UDP-прослушивателя на отдельном порту, на котором он будет получать полезную нагрузку JSON из другого приложения. Я хочу, чтобы сервер node.js немедленно перенаправил эти полезные данные JSON одному или нескольким подключенным веб-клиентам.

Я получил это далеко от некоторого начального Googling вокруг:

  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 для установки лиш живая связь между веб-сервером и клиентом:

    //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 не хватает ...

EDIT: благодаря человеку, что фиксированный код форматирования

ответ

10

Я сделал бегущий пример для вас, чтобы начать работать с: http://runnable.com/UXsar5hEezgaAACJ

На данный момент это всего лишь клиент loopback -> socket.io -> udp client -> udp server -> socket.io -> client.

вот ядро ​​его:

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

+0

@generalhenry Вы можете исправить код на [работоспособной] (http://runnable.com/ UXsar5hEezgaAACJ), так как мне нужно посмотреть, как вы передаете данные UDP на этом сервере? И на каком «порту»? – Ravi

+0

udp находится на случайном доступном порту (который является значением по умолчанию, если вы не указываете, где привязываться). Затем я обращаюсь к нему с помощью srv.address(), который возвращает данные адреса. (запускается исправление) – generalhenry

Смежные вопросы