POST到http服务器时,服务器必须:
- 发送TCP消息到外部代理
- 从外部代理接收TCP应答
- 发送响应到客户端
但是我的客户端几乎在同一时间发送2个post。如何确保两个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);
谢谢你,Zvika
下面的代码可以运行:
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 (e.g 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服务器应该尝试永远重新连接。这条路对吗?
Evert -非常感谢!Zvika