我正在写一个小TCP应用程序。当应用程序启动时,我尝试连接到远程服务器。如果该连接在几秒钟内没有成功,我想抓住它,抛出一个错误,然后重新开始这个过程。
这是我的连接基本代码。
var connected = false;
var socket = new net.Socket();
socket.setTimeout(2000, function () {
console.log('timeout');
console.log(connected);
if (connected) return;
// retry
});
socket.on('error', function (err) {
console.log(err);
});
socket.on('connect', function () {
console.log('connected');
connected = true;
});
socket.connect(port, host);
变量port和host指的是存在但未侦听指定端口的主机。
当我在本地尝试此操作时,2秒钟后,我看到打印到控制台的timeout
消息。当我在制作中尝试它时,我看到打印到控制台的connect
和timeout
消息,首先打印出connect
消息。如果我将超时更改为5秒或10秒,或者其他什么,则会发生同样的事情。在达到超时之前不打印任何内容,然后connect
消息和timeout
消息几乎同时显示,但始终首先显示connect
。
我甚至在timeout
处理程序中记录了连接变量,当然,它已设置为true
。
首先,我无法弄清楚首先发生connect
事件的原因。它显然没有连接,因为无论超时是什么,消息都不会打印,直到超时为止。
其次,如果连接成功,那么超时不应该被击中直到2秒之后(或者设置超时的时间长)。
有什么想法吗?可能是特定服务器设置的东西?我完全迷失了。
请注意,这与socket.io无关。我正在使用node的网络模块。
通过与我们的托管公司合作解决这个问题。发生了两件事。
process.stout.write
而不是console.log
打印出一些日志。 process.stout.write
没有添加换行符,并且我们的生产环境中使用的日志记录系统在看到换行符之前不会注册新日志。 这两件事的结合使我们在奇怪的时候看到了我们没有预料到的日志。问题解决了。