Node.js TCP套接字在轮询前等待几秒钟? (net.createServer)

时间:2012-11-15 20:26:50

标签: node.js sockets tcp

我在Node.js中有一个非常简单的TCP套接字。它连接到以XML格式发送数据的设备。有一个C#程序执行同样的技巧,但我必须在Node.js中构建它。

因此,当设备发送消息时,我会在5秒后收到响应! C#程序在1或2秒后得到它的地方。

看起来'tcp socket'具有特定的轮询频率或某种'等待功能'。这甚至可能吗?每次显示传入消息。它还显示“sock.on('close')”

的退出消息

似乎在5秒后'服务器'自动关闭。请参阅底线“console.log('[LISTENER]连接已暂停。');”之后,传入的消息将正确显示。

我的代码出了什么问题?

// Set Node.js dependencies
var fs = require('fs');
var net = require('net');

// Handle uncaughtExceptions
process.on('uncaughtException', function (err) {
    console.log('Error: ', err);
    // Write to logfile
    var log = fs.createWriteStream('error.log', {'flags': 'a'});
    log.write(err+'\n\r');

});

/*  
    -------------------------------------------------
    Socket TCP : TELLER
    -------------------------------------------------
*/
var oHOST = '10.180.2.210';
var oPORT = 4100;

var client = new net.Socket();
client.connect(oPORT, oHOST, function() {

            console.log('TCP TELLER tells to: ' + oHOST + ':' + oPORT);

            // send xml message here, this goes correct!
            client.write(oMessage);                     
});

// Event handler: incoming data
client.on('data', function(data) {
    // Close the client socket completely
    client.destroy();
});

// Event handler: close connection
client.on('close', function() {
    console.log('[TELLER] Connection paused.');
});     

/*  
    -------------------------------------------------
    Socket TCP : LISTENER
    -------------------------------------------------
*/
var iHOST = '0.0.0.0';
var iPORT = 4102;

// Create a server instance, and chain the listen function to it
var server = net.createServer(function(sock) {

    // We have a connection - a socket object is assigned to the connection automatically
    console.log('TCP LISTENER hearing on: ' + sock.remoteAddress +':'+ sock.remotePort);

    // Event handler: incoming data
    sock.on('data', function(data) {
        console.log('Message: ', ' '+data);
    });

    // Event handler: close connection
    sock.on('close', function(data) {
        console.log('[LISTENER] Connection paused.');
    });

}).listen(iPORT, iHOST);    

3 个答案:

答案 0 :(得分:0)

client.write()并不总是立即传输数据,它会在发送数据包之前等待缓冲区已满。 client.end()将关闭套接字并刷新缓冲区。

答案 1 :(得分:0)

你可以试试这个:http://nodejs.org/api/net.html#net_socket_setnodelay_nodelay

你的5秒延迟看起来确实有点奇怪。

答案 2 :(得分:0)

所以在“TELLER”中我不得不写“sock.write(data);”在“sock.on('data',function(data)”事件中。

现在有效。谢谢Jeremy和rdrey帮助我朝着正确的方向前进。