如何让服务器只在收到客户端消息后才回复? (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.
}
});
我假设你想在服务器端计算延迟或其他任何东西,所以我只是为服务器写了这个。但您也可以将逻辑应用于客户端。
我目前正在开发一个 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.
}
});
我假设你想在服务器端计算延迟或其他任何东西,所以我只是为服务器写了这个。但您也可以将逻辑应用于客户端。