简体   繁体   English

Node.js:一个接一个地处理对 HTTP 服务器的 2 个请求

[英]Node.js: Handle 2 requests to HTTP server one after another

Upon POST to http server, the server has to:在 POST 到 http 服务器后,服务器必须:

  1. send TCP message to external agent向外部代理发送 TCP 消息
  2. receive TCP reply from external agent接收来自外部代理的 TCP 回复
  3. send response to client向客户端发送响应

But my client sends 2 POSTs almost on the same time.但是我的客户几乎同时发送了 2 个 POST。 How can I make sure that the 2 POST requests will be handled one after another ?如何确保 2 个 POST 请求一个接一个地被处理?

 function sendReq (body, res) { var byteArr=[]; len = body.length; //get pure data without {,} data = body.substr (1,len-2); //convert to array arr = data.split (','); for (let i = 0; i < arr.length; i++) { num = parseInt (arr[i]); var numArr = num2arr (num); byteArr = byteArr.concat (numArr); } res.writeHead (200,{ 'Content-Type':'text/plain', 'Access-Control-Allow-Origin':'*'}); if (arr[1]==28) { var body = Buffer.alloc (392); res.write (body); } if (arr[1]==11) { var body = Buffer.alloc (28); res.write (body); } res.end (); } var http=require ('http'); http.createServer (function(req,res) { data=''; req.on ('data', chunk => { console.log (`Data chunk: ${chunk}`); data += chunk; sendReq (data,res); }); }).listen (8000);

Thank you, Zvika谢谢你,兹维卡

This code works:此代码有效:

 const Net = require('net'); var http=require ('http'); var events=require ('events'); var eventEmitter = new events.EventEmitter(); var reqQueue =[]; var resQueue =[]; // Create a new TCP client. const client = new Net.Socket(); /************************************************************************/ /* This callback will be fired upon TCP message sent from server /************************************************************************/ client.on('data',function(chunk){ //console.log (chunk); //pull response object from queue var res = resQueue.shift (); //add response header res.writeHead (200,{ 'Content-Type':'text/plain', 'Access-Control-Allow-Origin':'*'}); //write response body res.write (chunk); res.end (); }); /************************************************************************/ /* Convert number (eg 0xCAFE2DAD to 4 bytes) /************************************************************************/ function num2arr(n) { // Mask off 8 bytes at a time then shift them into place return [ (n & 0xFF) >>> 0, (n & 0xFF00) >>> 8, (n & 0xFF0000) >>> 16, (n & 0xFF000000) >>> 24, ]; } /************************************************************************/ /* Connect to TCP server /************************************************************************/ function tcpConnect () { // Send a connection request to the server. client.connect({ host:'localhost', port:5100 }); client.on('connect',function(){ console.log('Client: connection established with server'); }); } /************************************************************************/ /* Convert HTTP request to TCP raw data request /************************************************************************/ function sendReq (body) { let byteArr=[]; let len = body.length; //get pure data without {,} let data = body.substr (1,len-2); //console.log (data); //convert to array let arr = data.split (','); for (let i = 0; i < arr.length; i++) { let num = parseInt (arr[i]); let numArr = num2arr (num); byteArr = byteArr.concat (numArr); } client.write (Buffer.from(byteArr)); } /************************************************************************/ /* Event callback fired upon HTTP request /************************************************************************/ var eventHandler = function (){ //console.log ('event fired'); //console.log (resQueue.length); //pull request from queue var chunk = reqQueue.shift(); sendReq (chunk); } /************************************************************************/ eventEmitter.on ('httpReq', eventHandler); tcpConnect (); /************************************************************************/ /* Launch HTTP server /************************************************************************/ http.createServer (function(req,res) { let data=''; req.on ('data', chunk => { //console.log (`Data chunk: ${chunk}`); data += chunk; //push response to queue resQueue.push (res); //push request to queue reqQueue.push (data); //fire event eventEmitter.emit ('httpReq'); }); }).listen (8000);

This code crashes if the external TCP server is closed.如果外部 TCP 服务器关闭,此代码会崩溃。 In this case, the HTTP server should try to reconnect forever.在这种情况下,HTTP 服务器应该永远尝试重新连接。 Is this the right way ?这是正确的方法吗?

Evert - Thank you very much !埃弗特-非常感谢! Zvika兹维卡

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM