繁体   English   中英

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

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

在 POST 到 http 服务器后,服务器必须:

  1. 向外部代理发送 TCP 消息
  2. 接收来自外部代理的 TCP 回复
  3. 向客户端发送响应

但是我的客户几乎同时发送了 2 个 POST。 如何确保 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);

谢谢你,兹维卡

此代码有效:

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

如果外部 TCP 服务器关闭,此代码会崩溃。 在这种情况下,HTTP 服务器应该永远尝试重新连接。 这是正确的方法吗?

埃弗特-非常感谢! 兹维卡

暂无
暂无

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

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