【问题标题】:How to get the server to only reply back after getting a message from the client? (UDP Pinger, sockets)如何让服务器在收到客户端的消息后才回复? (UDP Pinger,套接字)
【发布时间】:2021-09-24 20:51:18
【问题描述】:

我目前正在开发一个 UDP pinger,客户端应该发送一条消息 (Ping) 并接收 pong 10 次。但是,消息同时发送 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 10 次,每次得到一个 pong?从您的措辞看来,您希望每次 ping 打 10 次乒乓球
  • @Rojo 我有点不确定如何提出我的问题,但是是的,你理解正确。
  • 所以您只想将每个用户的 ping 次数限制为 10?还是 10 次乒乓球时会发生什么特别的事情?
  • @Rojo 每个用户应该达到 10 次 ping,其中消息之间的延迟基本上是用往返时间计算的。换句话说,计算 ping。目前它只是一次打印所有内容,消息之间没有时间差
  • @Rojo 我还必须补充一点,它应该在 10 次乒乓球结束时计算发送的消息之间的延迟。但我还没有实现,因为我仍然不确定如何做到这一点。

标签: javascript node.js udp


【解决方案1】:

您只需要计算收到 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.
  }
});

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2018-04-04
    • 2019-09-05
    相关资源
    最近更新 更多