如何让服务器只在收到客户端消息后才回复? (UDP Pinger,套接字)

How to get the server to only reply back after getting a message from the client? (UDP Pinger, sockets)

我目前正在开发一个 UDP pinger,客户端应该在其中发送一条消息 (Ping) 并接收回 10 次 pong。然而,消息同时发送了10次,其想法是让服务器在收到ping后发回pong,而不是让终端一次发送所有内容。

这是由于围绕 server.send 的 for 循环,我知道这一点。我只是不确定如何让服务器在收到消息后只发回回复,从而使服务器为每条消息记录不同的时间。我希望我的问题是有道理的。到目前为止,我已经想出了这个:

var host = "127.0.0.1", port = 33333;

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

var date1 = new Date()
var today = Buffer.from(date1)



server.on('listening', () => {
    const address = server.address();
    console.log(`server listening on port ` + 4000 + ' and address 127.0.0.1');
  });



server.on( "message", function( msg, rinfo ) {
    for (let message = 0; message < 10; message++){
    const message = 'Ping'
    server.send( message, 0, msg.length, rinfo.port, rinfo.address, date1 );
    console.log( rinfo.address + ':' + rinfo.port + ' - ' + msg + ' . ' + date1 );
}});



server.on('error', (err) => {
    console.log(`server error:\n${err.stack}`);
    server.close();
  });

server.on("close", function(){
  console.log("\n Client is offline")
})

server.bind( port, host );

客户端:

var host = "127.0.0.1", port = 33334;

var dgram = require( "dgram" );
var buffer = require('buffer');
var client = dgram.createSocket( "udp4" );

var date1 = new Date()
var today = Buffer.from(date1)
console.log(date1)


client.on('listening', () => {
    const address = client.address();
    console.log(`client listening on port ` + 4000 + ' and address 127.0.0.1');
  });


client.on( "message", function( msg, rinfo ) {
    console.log( rinfo.address + ':' + rinfo.port + ' - ' + msg + ' - ' + date1 );
});

client.on('error', (err) => {
    console.log(`server error:\n${err.stack}`);
    server.close();
  });

client.on("close", function(){
  console.log("\n Client is offline")
})

client.bind( port, host ); //client listens to a port

var message = "Pong!"
client.send(message, 0, message.length, 33333, "127.0.0.1", date1 );

到目前为止,代码还打印出每条消息发送的时间(我对所有发送的消息都获得了相同的时间)。关于我如何在发送 10 次 ping 和 pong 后合并往返时间的任何想法都将是惊人的。

非常感谢!

您只需要计算收到 ping 的次数并检查它是否等于 10:

var numPingPongs = 0;

server.on( "message", function( msg, rinfo ) {
  if (numPingPongs < 10) {
    const message = 'Ping'
    server.send( message, 0, msg.length, rinfo.port, rinfo.address, date1 );
    console.log( rinfo.address + ':' + rinfo.port + ' - ' + msg + ' . ' + date1 );
    numPingPongs++;
  } else {
    // Reached ten ping pongs, do whatever here.
  }
});

我假设你想在服务器端计算延迟或其他任何东西,所以我只是为服务器写了这个。但您也可以将逻辑应用于客户端。