2013-12-20 345 views
1

我正在嘗試在node.js中寫一個應用程序來向設備發送udp請求(它具有udp服務器),然後接收響應並顯示它。該設備以這樣的方式工作,即在其端口11220上接收到請求時立即返回響應。Node.js UDP客戶端處理來自udp服務器的響應

下面的代碼發送一個udp請求到設備,設備立即迴應(我可以在wireshark中看到它),但我無法處理/顯示恢復的消息。或者至少我只想在收到來自設備的回覆時能夠顯示消息。請讓我知道我的代碼中缺少什麼,或者向我展示完成代碼。非常感謝。

同時,我不喜歡使用socket.io等

var PORT = 11220 ; 
var HOST = '192.168.1.111'; 

var dgram = require('dgram'); 
var message = new Buffer(9); 
var client = dgram.createSocket('udp4'); 
client.send(message, 0, message.length, PORT, HOST, function(err, bytes) { 
    if (err) throw err; 
    console.log('UDP message sent to ' + HOST +':'+ PORT); 
    client.close(); 

}); 


client.on('listening', function() { 
    var address = server.address(); 
    console.log('UDP Server listening on ' + address.address + ":" + address.port); 
}); 

client.on('message', function (message, remote) { 
    // CAN I HANDLE THE RECIVED REPLY HERE???? 
    console.log(remote.address + ':' + remote.port +' - ' + message); 

}); 
+0

所以你'message'處理程序從未運行改變的代碼? '聽'一個運行嗎?如果在添加事件處理程序後只發送*,會發生什麼情況。 – loganfsmyth

回答

2

整個問題只是偶然,所以我想我應該管的一個答案:

在你client.send功能,調用client.close();將關閉與服務器的UDP連接。因此,如果您想收聽留言,您不應在發送留言後立即致電留言。

其次,loganfsmyth的評論提供了一些很好的建議 - 您應該先添加您的事件處理程序,然後發送消息。

最後,這是需要得到您的方案工作

var client = dgram.createSocket('udp4'); 

client.on('listening', function() { 
    var address = client.address(); 
    console.log('UDP Server listening on ' + address.address + ":" + address.port); 
}); 

client.on('message', function (message, remote) { 

    console.log(remote.address + ':' + remote.port +' - ' + message); 

}); 

client.send(message, 0, message.length, PORT, HOST, function(err, bytes) { 

    if (err) throw err; 
    console.log('UDP message sent to ' + HOST +':'+ PORT); 

});