node.js - 为什么服务器会反复响应我从控制台发送的每条新输入数据?
问题描述
我只是想学习一些客户端-服务器基础知识,而我几乎已经完成了我想做的事情。我只是向服务器发送一些输入,并让它用它收到的数据响应客户端。但是,一旦我发送了第一条数据,它就可以正常工作,但是一旦我发送另一个输入,服务器就会响应同一条数据的两个实例,依此类推。我该如何解决这个问题?
服务器:
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()
,并且在实际回答问题时没有协调。
推荐阅读
- java - 积极向后看行为不正确
- android - 如何在 Android 中读取和显示 csv 文件中的数据?
- python - 我们可以使用包含标签图像的 caltech101 数据集检测图像中的多个对象吗?
- python-3.x - 如何访问从 kaggle 下载到 Colaboratory notebook 的文件?
- asp.net-mvc - 将 Sitecore 项目 ID 从控制器传递给模型
- php - 如何通过 ajax 将 jQuery 变量发布到外部 PHP SQL 脚本并返回值
- java - Spring for Apache Kafka:无法识别的生产者配置 - 'delivery.timeout.ms'
- sql - 如何在 SQL 中使用正则表达式以及 ~ 是什么意思
- c# - .netcore 中没有 system.drawing?该怎么办?
- c++ - 在 64 位 Ubuntu (18.04) 系统上运行 32 位可执行文件时,如何修复 ld-linux.so.2 中的 gdb 挂起?