为什么服务器对我从控制台发送的每条新输入数据进行迭代响应?
Why does the server respond iteratively with each new piece of input data I send it from the console?
我只是想学习一些客户端-服务器基础知识,而且我几乎已经完成了我想做的事情。我只是向服务器发送一些输入,并让它用收到的数据响应客户端。但是,一旦我发送了第一条数据,它就可以正常工作,但是一旦我发送了另一个输入,服务器就会响应同一条数据的两个实例,依此类推。我该如何解决这个问题?
服务器:
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 6969;
var server = net.createServer();
server.on('connection', function(sock) {
console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);
sock.on('data', function(data) {
console.log('DATA ' + sock.remoteAddress +':' + data);
// write back data received to the client
sock.write('You said "' + data + '"');
});
});
server.listen(PORT, HOST);
console.log('Server listening on ' + HOST +':'+ PORT);
客户端:
var net = require('net');
var readline = require('readline');
var HOST = '127.0.0.1';
var PORT = 6969;
const r1 = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var client = new net.Socket();
client.connect(PORT, HOST, function() {
console.log('CONNECTED TO: ' + HOST + ':' + PORT);
// continue talkback
function waitForUserInput() {
r1.question("Enter some data you wish to send: ", function(data) {
if(data == "exit") {
r1.close();
} else {
// write input data to the server
client.write(data);
// receive what data server sends back to client
client.on('data', function(server_data) {
console.log('DATA: ' + server_data);
});
setInterval(waitForUserInput, 1000);
}
});
}
waitForUserInput();
});
您不断添加越来越多的 client.on('data', ...)
处理程序。每次调用 waitForUserInput()
,您最终都会为 data
消息添加另一个重复的处理程序。因此,在调用 waitForUserInput()
两次后,您有两个相同的 data
消息处理程序,因此当一条新数据到达时,两个处理程序中的每一个都会被调用,并且控制台中的输出会出现两次。一件一件的数据到达,但您有重复的处理程序正在侦听它。
您可以使用 .once()
而不是 .one()
,或者您可以将侦听传入数据的处理程序移到函数外部,这样它就只安装一次。
顺便说一句,由于几个原因,这里使用 setInterval()
也是一个问题。每次调用 waitForUserInput()
时,您都在创建一个新的间隔计时器,而这与实际回答问题的时间之间没有协调。
我只是想学习一些客户端-服务器基础知识,而且我几乎已经完成了我想做的事情。我只是向服务器发送一些输入,并让它用收到的数据响应客户端。但是,一旦我发送了第一条数据,它就可以正常工作,但是一旦我发送了另一个输入,服务器就会响应同一条数据的两个实例,依此类推。我该如何解决这个问题?
服务器:
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 6969;
var server = net.createServer();
server.on('connection', function(sock) {
console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);
sock.on('data', function(data) {
console.log('DATA ' + sock.remoteAddress +':' + data);
// write back data received to the client
sock.write('You said "' + data + '"');
});
});
server.listen(PORT, HOST);
console.log('Server listening on ' + HOST +':'+ PORT);
客户端:
var net = require('net');
var readline = require('readline');
var HOST = '127.0.0.1';
var PORT = 6969;
const r1 = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var client = new net.Socket();
client.connect(PORT, HOST, function() {
console.log('CONNECTED TO: ' + HOST + ':' + PORT);
// continue talkback
function waitForUserInput() {
r1.question("Enter some data you wish to send: ", function(data) {
if(data == "exit") {
r1.close();
} else {
// write input data to the server
client.write(data);
// receive what data server sends back to client
client.on('data', function(server_data) {
console.log('DATA: ' + server_data);
});
setInterval(waitForUserInput, 1000);
}
});
}
waitForUserInput();
});
您不断添加越来越多的 client.on('data', ...)
处理程序。每次调用 waitForUserInput()
,您最终都会为 data
消息添加另一个重复的处理程序。因此,在调用 waitForUserInput()
两次后,您有两个相同的 data
消息处理程序,因此当一条新数据到达时,两个处理程序中的每一个都会被调用,并且控制台中的输出会出现两次。一件一件的数据到达,但您有重复的处理程序正在侦听它。
您可以使用 .once()
而不是 .one()
,或者您可以将侦听传入数据的处理程序移到函数外部,这样它就只安装一次。
顺便说一句,由于几个原因,这里使用 setInterval()
也是一个问题。每次调用 waitForUserInput()
时,您都在创建一个新的间隔计时器,而这与实际回答问题的时间之间没有协调。