2013-11-25 3 views
0

Я хочу оценить время туда и обратно между клиентом и сервером. Здесь пользователь может выбрать, насколько велика величина запроса/ответа сообщения (тела). На стороне клиента я использовал метод Ajax-Post для отправки 100 сообщений с интервалом в 100 мс на http-сервер. Unfortunatley У меня возникла проблема в node.js, что httpServer.js не может обрабатывать размеры запросов клиента более 8 кб. В этом случае переменная responseSizeServer в httpServer.js получает значение «undefined», а консоль выдает ошибку: «Недопустимая длина массива». Вопрос в том, почему переменная responseSizeServer получила значение undefined в этом случае? Я полагаю, что http-Server.js обрабатывает метод .end быстрее, чем входящий запрос от клиента. Как вы думаете, и как это можно решить? Заранее спасибо :)Запросы более 8 kb

Вот код:

клиента:

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

ответ

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.

+0

Большое спасибо, это было правильно! – user3030559

Смежные вопросы