2013-04-24 21 views
5

Sono nuovo a node.js, quindi perdona l'ignoranza se questo è semplice.node.js ascolta UDP e inoltra ai client Web http connessi

Quello che voglio fare è impostare un semplice server http node.js al quale si connette un client web. Voglio anche che il server node.js funzioni come un listener UDP su una porta separata, sulla quale riceverà i payload JSON da qualche altra applicazione. Voglio che il server node.js invii immediatamente questi payload JSON a uno o più client Web connessi.

ho ottenuto questo lontano da un po 'googling iniziale intorno:

  1. Creare un semplice server http node.js che risponde con una pagina html statica:

    //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. inizializzare un server di UDP su una porta separata:

    //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. Utilizzare socket.io per stabilire no una connessione diretta tra web-client e 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); 
        } 
    ); 
    }); 
    

Credo che il mio problema è che non so come colmare 2 e 3, per ottenere i pacchetti UDP ricevuti trasmessi alla presa collegata. io clienti. O forse c'è un modo più semplice ed elegante per farlo? Ho trovato la documentazione per socket.io a mancare ...

EDIT: grazie alla persona che ha fissato il codice di formattazione

risposta

10

Ho fatto un esempio di esecuzione per poter andare avanti con: http://runnable.com/UXsar5hEezgaAACJ

Per ora è solo un client di loopback -> socket.io -> client udp -> server udp -> socket.io -> client.

qui è il nocciolo della questione:

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

Grazie, questo mi ha aiutato a raggiungere proprio quello che volevo :) – kufudo

+0

@generalhenry Puoi sistemare il codice a [eseguibile] (http://runnable.com/ UXsar5hEezgaAACJ), come ho bisogno di vedere come si trasmettono i dati 'UDP' su questo server? E su cosa 'porto'? – Ravi

+0

L'udp si trova su una porta disponibile casualmente (che è l'impostazione predefinita se non si specifica dove eseguire il binding). Quindi lo indirizzo utilizzando srv.address() che restituisce i dettagli dell'indirizzo. (eseguibile in esecuzione) – generalhenry