6

我想创建一个小的 ping 脚本。我是 node 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 替换 'message.length' 以获得 1kb 对吗?但我得到一个错误'throw new Error('Offset + length beyond buffer length');'

我不太明白为什么。

4

2 回答 2

9

一件事是发送数据,另一件事是接收数据。由于 UDP 协议是双向的,那么实际上客户端和服务器之间并没有严格的区别。因此,您的服务器和客户端代码将几乎相同,不同之处在于实际上一个会发送数据包而另一个只会响应。另请注意,您有一个无限循环,因为您可能使用.sendwithPORTHOST变量,并且您必须发送到不同的主机/端口对。

这是一个例子:

服务器

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" );
于 2012-11-12T20:19:22.933 回答
0

这是一个老问题,但是您实际上并不需要将客户端绑定到端口,您可以使用未关闭的底层套接字立即回复

服务器.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');

客户端.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');

启动服务器,然后启动客户端,进行无休止的乒乓球比赛。

于 2018-05-11T10:00:55.003 回答