html node.js udp

html - Res.write no funciona cuando se envía continuamente paquetes UDP



node.js (1)

//Sending UDP message to TFTP server //dgram modeule to create UDP socket var express= require(''express''), fs= require(''fs''),path = require(''path''),util = require(''util''),dgram= require(''dgram''),client= dgram.createSocket(''udp4''),bodyParser = require(''body-parser''),app = express(), ejs = require(''ejs''); var plotly = require(''plotly'')("Patidar", "ku0sisuxfm") // parse application/x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended: false })) // parse application/json app.use(bodyParser.json()) app.use(express.static(''public'')); //Reading in the html file for input page app.get(''/'', function(req, res){ var html = fs.readFileSync(''index2.html''); res.writeHead(200, {''Content-Type'': ''text/html''}); res.end(html); }); //reading in html file for output page app.get(''/output'', function(req, res){ var html = fs.readFileSync(''index4.html''); res.writeHead(200, {''Content-Type'': ''text/html''}); res.end(html); }); //Recieving UDP message app.post(''/output'', function(req, res){ var once= req.body.submit; if (once == "Once") { //Define the host and port values of UDP var HOST= req.body.ip; var PORT= req.body.port; //Reading in the user''s command, converting to hex var message = new Buffer(req.body.number, ''hex''); //Sends packets to TFTP client.send(message, 0, message.length, PORT, HOST, function (err, bytes) { if (err) throw err; }); //Recieving message back and printing it out to webpage client.on(''message'', function (message) { fs.readFile(''index3.html'', ''utf-8'', function(err, content) { if (err) { res.end(''error occurred''); return; } var temp = message.toString(); //here you assign temp variable with needed value var renderedHtml = ejs.render(content, {temp:temp, host: HOST, port: PORT}); //get redered HTML code res.end(renderedHtml); //var data = [{x:[req.body.number], y:[temp], type: ''scatter''}]; //var layout = {fileopt : "overwrite", filename : "simple-node-example"}; //plotly.plot(data, layout, function (err, msg) { //if (err) return console.log(err); //console.log(msg); //}); }); }); } if (once == "continuous") { var timesRun = 0; var requestLoop = setInterval(function(){ timesRun += 1; if(timesRun === 5){ clearInterval(requestLoop); } //Define the host and port values of UDP var HOST= req.body.ip; var PORT= req.body.port; //Reading in the user''s command, converting to hex var message = new Buffer(req.body.number, ''hex''); //Sends packets to TFTP client.send(message, 0, message.length, PORT, HOST, function (err, bytes) { if (err) throw err; }); //Recieving message back and printing it out to webpage client.on(''message'', function (message) { fs.readFile(''index3.html'', ''utf-8'', function(err, content) { if (err) { res.end(''error occurred''); return; } var temp = message.toString(); //here you assign temp variable with needed value var renderedHtml = ejs.render(content, {temp:temp, host: HOST, port: PORT}); //get redered HTML code res.write(renderedHtml); //var data = [{x:[req.body.number], y:[temp], type: ''scatter''}]; //var layout = {fileopt : "overwrite", filename : "simple-node-example"}; //plotly.plot(data, layout, function (err, msg) { //if (err) return console.log(err); //console.log(msg); //}); }); }); }, 10000); } }); //Setting up listening server app.listen(3000, "192.168.0.136"); console.log(''Listening at 192.168.0.136:3000'');

Tengo dos botones, un botón envía el paquete UDP una vez, mientras que un botón continuo envía los mismos paquetes UDP cada 10 segundos. Sin embargo, cuando se presiona este botón, res.write repite todo el resultado nuevamente. Mire la foto adjunta para ver la salida [! [Introduzca la descripción de la imagen aquí] [1]] [1]


Después de poner su código en un formateador de código automático para hacerlo legible, puedo ver que está haciendo esto:

client.on(''message'', function (message) { ...

dentro de su controlador app.post() . Eso significa que cada vez que se llama a su controlador de publicación, agrega otro client.on(''message'', ...) . Entonces, después de que se llama la segunda vez, tienes dos manejadores de eventos, después de que se llama la tercera vez, tienes tres y así sucesivamente.

Entonces, tan pronto como tenga estos duplicados, se llamará a cada uno y se aplicarán acciones duplicadas.

Tus elecciones son:

  1. Utilice .once() para el manejador de eventos para que se elimine automáticamente después de que se active.
  2. Quítelo manualmente después de que se dispare o cuando haya terminado con él.
  3. app.post() una vez fuera de su controlador app.post() para que nunca agregue duplicados.
  4. Reestructura la forma en que funciona tu código para que no tenga este tipo de problema. Por ejemplo, tiene dos manejadores diferentes para el mismo mensaje entrante. Este es un signo de código con mucho estado que es más complejo de escribir correctamente. Un mejor diseño que no sea con estado de esa manera sería más simple.