我在工作中遇到这个超级奇怪的问题;我制作了两个小的node.js程序,它们通过HTTP get和post请求相互交互。程序B监视一些文本文件,并在文件发生变化时(每分钟一次)向程序A发送一个发布请求。在确认该请求之后,程序A然后向程序B发送一个发布请求,然后程序B写入另一组文本文件。
托管程序B的计算机,在当天的某个(不可预测的)点,只是停止获得正确的网络连接 - 我们将无法使用浏览器,无法远程桌面,并且节点程序也无法通过ECONNRESET错误进行通信,记录。但是,它可以ping网络和Internet上的其他计算机。我们认为网卡有问题所以我们实际上切换了运行程序B的机器,我们仍然遇到同样的问题。
我们注意到这只会在Node.js运行时发生,并且正在主动向程序A发送https请求。重新启动是我们发现的唯一可以使事情恢复正常的解决方案。
我们的下一个想法是安装Wireshark,看看有什么问题。我们注意到的第一件事是在'info'字段:
3000→53550 [RST,ACK] Seq = 2 Ack = 1 Win = 0 Len = 0
它每分钟发生一次,似乎来自托管程序A的机器。这是正常行为吗? (Wireshark以红色突出显示)此时网络通信仍然正常。
此时网络通信失败(除了能够ping)。
我完全迷失了。我不知道这是我的编程问题,还是网络工具的节点实现问题,或者它是驱动程序/硬件问题还是内核问题。
我们在两台机器上运行Windows 7。节点4.4.1
对此可能提出的任何帮助或建议都会非常感激。
修改
以下是有关在程序B (我正在使用Express.js)中发送和接收信息的一些代码段。
接收:
app.post('/eton_call', function (req, res){
logger.info("POST REQUEST: eton_call") //using winston.js to log things
reqCalls_writer.write_file(req.body); //writes the text file in a certain format
res.sendStatus(201);
})
app.post('/USERPRUN_call', function (req, res){
logger.info("POST REQUEST: userprun_call")
userPrun_writer.write_file(req.body);
res.sendStatus(201);
})
发送:(他们都使用这个原型函数。参数,快照,是一些JSON)
Eton_file_sync.prototype.send_snapshot = function(snapshot) {
logger.info('sending snapshot');
var post_options = {
host: config.fex_server.host,
port: config.fex_server.port,
path: this.post_uri,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': snapshot.length
}
};
var post_req = http.request(post_options, function(res) {
logger.info("STATUS: " + res.statusCode);
res.setEncoding('utf8');
res.on('data', function (chunk) {
logger.info('Response: ' + chunk);
});
});
post_req.on('error', function(e){
logger.error('Snapshot not sent. Please ensure connectivity to fex-server.js. This snapshot will be lost. Error Message: ' + e.message);
})
post_req.write(snapshot);
post_req.end();
}
这是编写文件的代码
Eton_asc_writer.prototype.write_file = function (data_arr){
logger.info("writing file");
var buffer_data = '';
data_arr.forEach(function (data_element, index, array){
for (prop in data_element){
_.find(this, function(template_element){//finds the template_element with the correct descriptions
return template_element.description == prop; //^
}).datum = data_element[prop];//copies over datum to template element
}
//finds the first then second then third.. nth field.
for (var field_order = 1; field_order < this.length; field_order++){
var current_field = _.find(this, function(template_element){
return template_element.field_order == field_order;
});
if (!current_field.datum && (current_field.datum != 0)){
current_field.datum = "";
}
var required_padding_amount = current_field.required_length - current_field.datum.toString().length;
assert(required_padding_amount >= 0, "invalid length on " + current_field.description);
//assert(current_field.type == typeof current_field.datum, "datum types don't match");
for (var padding = ''; padding.length < required_padding_amount;)
padding += ' ';
if (current_field.type == "string"){
current_field.padded_datum = current_field.datum + padding + ';';
}
else {
current_field.padded_datum = padding + current_field.datum + ';';
}
buffer_data += current_field.padded_datum;
}
buffer_data += '\r\n';//buffer newline
}, this.template_in_use);
//console.log(buffer_data);
write_buffer = new Buffer(buffer_data, 'utf8');
var file = fs.createWriteStream(this.filename);
file.write(write_buffer);
file.end();
}
对于程序A ,当时发生的唯一发布请求来自:(req_calls是一组共享相同键/值对的对象)
function exportReqCalls(req_calls){
if (req_calls.length == 0){
return;
}
exported_req_calls = JSON.stringify(req_calls);
var post_options = {
host: config.eton_agent.host,
port: config.eton_agent.port,
path: '/eton_call',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': exported_req_calls.length
}
};
var post_req = http.request(post_options, function(res) {
logger.info("STATUS: " + res.statusCode);
res.setEncoding('utf8');
res.on('data', function (chunk) {
//console.log('Response: ' + chunk);
});
});
post_req.on('error', function(e){
logger.error('ReqCall not sent. Please ensure connectivity to eton-agent.js. Error Message: ' + e.message);
});
post_req.write(exported_req_calls);
post_req.end();
}