Node JS: Ping Server & Client UDP



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

这是我到目前为止所拥有的:

服务器:

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++;
});

更新:

谢谢!这确实有帮助。但是我还有另一个问题。假设我想以特定数量的字节发送数据包。我会用1000替换为1kb的1000吧?但是我会遇到一个错误"投掷新错误("偏移 长度超过缓冲区长度");'

我不太明白为什么。

一件事是发送数据,另一件事是接收它。由于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" );

这是一个旧的问题,但是您也不需要将客户端绑定到端口,您可以使用未关闭的基础套接字来立即回复

server.js

const dgram = require('dgram');
const server = dgram.createSocket('udp4');
const reply = new Buffer('pong');
server.on('message', function (message, remote) {
    console.log('Got', message.toString());
    server.send(reply, 0, reply.length, remote.port, remote.address);
});
server.bind(6790, '0.0.0.0');

client.js

const dgram = require('dgram');
const client = dgram.createSocket('udp4');
const reply = new Buffer('ping');
client.on('message', function (message, remote) {
    console.log('Got', message.toString());
    client.send(reply, 0, reply.length, 6790, '0.0.0.0');
});
client.send(reply, 0, reply.length, 6790, '0.0.0.0');

启动服务器,然后启动客户端以进行无尽的乒乓游戏。

最新更新