2012-11-12 38 views
6

我想创建一个小的ping脚本。我是节点js的初学者。我最终的小目标是让客户端ping服务器。我希望服务器通过在控制台中记录消息来确认数据包,并且我希望它将相同的数据包/消息发送回客户端。节点JS:Ping服务器和客户端UDP

这是我到目前为止有:

服务器:

var PORT = 33333; 
var HOST = '127.0.0.1'; 

var dgram = require('dgram'); 
var server = dgram.createSocket('udp4'); 

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

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

    console.log(remote.address + ':' + remote.port +' - ' + message); 
    // I added a server.send but it gave me an infinite loop in the server console 

}); 

server.bind(PORT, HOST); 

客户:

var PORT = 33333; 
var HOST = '127.0.0.1'; 

var dgram = require('dgram'); 
var message = new Buffer('My KungFu is Good!'); 

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

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

    console.log("The packet came back"); 

}); 


client.send(message, 0, message.length, PORT, HOST, function(err, bytes) { 
    if (err) throw err; 
    console.log('UDP message sent to ' + HOST +':'+ PORT); 
    count++; 
}); 

UPDATE:

谢谢!这真的有帮助。 但我有另一个问题。 假设我想以特定数量的字节发送数据包。 我会用1000替换'message.length'1kb权利? 但我得到一个错误'抛出新的错误('偏移+长度超出缓冲区长度');'

我不太明白为什么。

回答

9

有一件事是发送数据,另一件事是接收它。由于UDP协议是双向的,因此实际上客户端和服务器之间没有严格的区别。所以你的服务器和客户端代码几乎是一样的,区别在于实际上一个会发送数据包,其他的只会响应。还要注意,你有一个无限循环,因为你可能使用.sendPORTHOST变量,你必须发送到不同的主机/端口对。

下面是一个例子:

服务器

var host = "127.0.0.1", port = 33333; 

var dgram = require("dgram"); 

var server = dgram.createSocket("udp4"); 

server.on("message", function(msg, rinfo) { 
    console.log(rinfo.address + ':' + rinfo.port + ' - ' + msg); 
    server.send(msg, 0, msg.length, rinfo.port, rinfo.address); // added missing bracket 
}); 
server.bind(port, host); 

客户

// NOTE: the port is different 
var host = "127.0.0.1", port = 33334; 

var dgram = require("dgram"); 

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

client.on("message", function(msg, rinfo) { 
    console.log("The packet came back"); 
}); 

// client listens on a port as well in order to receive ping 
client.bind(port, host); 

// proper message sending 
// NOTE: the host/port pair points at server 
var message = new Buffer("My KungFu is Good!"); 
client.send(message, 0, message.length, 33333, "127.0.0.1"); 
+0

谢谢!这真的有帮助。 但我有另一个问题。 假设我想以特定数量的字节发送数据包。 我会用1000替换'message.length'1kb权利? 但我得到一个错误'抛出新的错误('偏移+长度超出缓冲区长度');' 我不太明白为什么。 –

+0

,因为你的缓冲区长度是18字节(“我的功夫很好!”长度,默认编解码器是每个字符为ASCII /二进制字节)。用'var message = new Buffer(1000)'创建你的消息;'发送1000字节 –