Javascript 节点JS:Ping服务器&;客户端UDP

Javascript 节点JS:Ping服务器&;客户端UDP,javascript,node.js,Javascript,Node.js,我想创建一个小的ping脚本。我是NodeJS的初学者。我最终的小目标是让客户端ping服务器。我希望服务器通过在控制台中记录消息来确认数据包,并将相同的数据包/消息发送回客户端 这就是我到目前为止所做的: 服务器: var PORT = 33333; var HOST = '127.0.0.1'; var dgram = require('dgram'); var server = dgram.createSocket('udp4'); server.on('listening', fun

我想创建一个小的ping脚本。我是NodeJS的初学者。我最终的小目标是让客户端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++;
});
客户端:

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,对吗? 但我得到一个错误“抛出新错误(‘偏移量+长度超出缓冲区长度’);”


我不太明白为什么。

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

下面是一个例子:

服务器

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');

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

谢谢!这真的很有帮助。但我还有一个问题。假设我想发送特定字节数的数据包。我会用1000代替“message.length”表示1kb,对吗?但我得到一个错误“抛出新错误(‘偏移量+长度超出缓冲区长度’);”我不太明白为什么。因为您的缓冲区是18字节长(“我的功夫很好!”。长度,默认编解码器是ascii/二进制字节/字符)。使用
var message=new Buffer(1000)创建消息
发送1000字节有人知道我是否可以使用它向UDP打印机发送命令吗?@Marco-sure,你“只”需要知道并实现打印机的协议。很可能你不想这么做。如果可行的话,这是一个耗时且容易出错的过程。最好使用一些现有的库。