Javascript 节点JS:Ping服务器&;客户端UDP
我想创建一个小的ping脚本。我是NodeJS的初学者。我最终的小目标是让客户端ping服务器。我希望服务器通过在控制台中记录消息来确认数据包,并将相同的数据包/消息发送回客户端 这就是我到目前为止所做的: 服务器: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
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,你“只”需要知道并实现打印机的协议。很可能你不想这么做。如果可行的话,这是一个耗时且容易出错的过程。最好使用一些现有的库。