2

Node.js に非常に単純な TCP ソケットがあります。データを XML 形式で送り返すデバイスに接続します。これと同じトリックを行う C# プログラムがありますが、Node.js でビルドする必要がありました。

そのため、デバイスがメッセージを送信すると、約 5 秒後に応答が返ってきます。C# プログラムが 1 ~ 2 秒後に取得する場所。

「tcp ソケット」には特定のポーリング頻度またはある種の「待機機能」があるようです。それは可能ですか?着信メッセージが表示されるたびに。また、「sock.on('close')」の終了メッセージも表示されます。

5 秒後に「サーバー」が自動的に閉じるようです。一番下の行「console.log('[LISTENER] Connection paused.');」を参照してください。その後、受信メッセージが正しく表示されます。

コードの何が問題になっていますか?

// 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);    
4

3 に答える 3

0

そのため、「TELLER」内に「sock.write(data);」と記述しなければなりませんでした。「sock.on('data'、function(data)」イベント内。

今は動作します。正しい方向に私を助けてくれたJeremyとrdreyに感謝します。

于 2012-11-15T21:45:00.660 に答える
0

client.write() は常にすぐにデータを送信するとは限りません。バッファがいっぱいになるまで待ってからパケットを送信します。client.end() はソケットを閉じ、バッファをフラッシュします。

于 2012-11-15T20:33:47.637 に答える
0

これを試すことができます: http://nodejs.org/api/net.html#net_socket_setnodelay_nodelay

ただし、5 秒の遅延は少し奇妙に思えます。

于 2012-11-15T20:54:49.317 に答える