请求大于8 kb

时间:2013-11-25 09:23:28

标签: javascript ajax node.js http

我想评估客户端和服务器之间的往返时间。在这里,用户可以选择消息(正文)的请求/响应大小应该有多大。在客户端,我使用Ajax-Post方法以100毫秒的间隔向http服务器发送100条消息。 Unfortunatley我在node.js中遇到了问题,httpServer.js无法处理大于8 kb的客户端请求大小。在这种情况下,httpServer.js中的变量responseSizeServer获取值“undefined”,并且控制台抛出错误:“无效的数组长度”。问题是为什么变量responseSizeServer在这种情况下得到了值undefined?我想http-Server.js比来自客户端的传入请求更快地处理.end方法。您如何看待以及如何解决?在此先感谢:)

以下是代码:

客户端:

var i = 0;  
var iterations = 100;
function connectSpeed(){
 run = window.setInterval("startSpeed()", 100); 
 }
function startSpeed()
{
 //Variablen
var requestSizeClient = 8 *1024; // 8 kb request Size client
    var responseSizeServer = 16 * 1024; // 16 kb response size server

var xmlhttp;    

xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST","http://localhost:8000", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.onreadystatechange=function(){
     if (xmlhttp.readyState==4 && xmlhttp.status==200){
    var receiveTimeCl = new Date().getTime().toString();
    //evaluate response from httpServer.js
            var message = xmlhttp.responseText;

     }
   }

   //send data to the server
   xmlhttp.send(new Date().getTime().toString() + '#' + new Array((eval(requestSizeClient+1))-(new Date().getTime().toString().length+3)).join('X') + '#' + responseSizeServer);
i++;
if(i==iterations) {
window.clearInterval(run);
i=0;
}
}// end start-speed

服务器 :( httpServer.js)

var http = require('http');
http.createServer(function (req, res) {

var receiveTimeServer;
var clientMsg;
var sendTimeClient;
var responseSizeServer;
var message;

req.on('data', function (chunk) {
    receiveTimeServer = new Date().getTime().toString();
    message = chunk.toString('utf8');
    clientMsg = message.split('#');
    responseSizeServer = parseInt(clientMsg[2]);
    sendTimeClient = clientMsg[0];

res.writeHead(200, {'Content-Type': 'text/plain','Access-Control-Allow-Origin' : '*'});
res.end(receiveTimeServer + '#' + new Date().getTime().toString() + '#' + sendTimeClient + '#' + new Array(responseSizeServer).join('X'));
});
  }).listen(8000);
  console.log('Ajax_Server running');

1 个答案:

答案 0 :(得分:0)

Node.js中的请求是流,每个data事件对应一个传入的块。如果请求很大,则会发出多个块:然后可以在发送请求时处理请求,并且在处理请求之前不必等待接收完整请求。

在您的具体情况下,您想要的是缓冲完整的消息,然后处理它:

var message = '';
req.on('data', function (chunk) {
    message += chunk; // concatenate all chunks
});

req.on('end', function() {
    receiveTimeServer = new Date().getTime().toString();
    message = message.toString('utf8');
    clientMsg = message.split('#');
    responseSizeServer = parseInt(clientMsg[2]);
    sendTimeClient = clientMsg[0];
    res.writeHead(200, {'Content-Type': 'text/plain','Access-Control-Allow-Origin' : '*'});
    res.end(receiveTimeServer + '#' + new Date().getTime().toString() + '#' + sendTimeClient + '#' + new Array(responseSizeServer).join('X'));
});

您可以在Node.js's streams documentation中找到代码示例的详尽说明。