我只是想學習一些客戶端-服務器的基礎知識,我想做的事情幾乎已經完成了。我只是向服務器發送一些輸入,然后讓它將收到的資料回復給客戶端。然而,一旦我發送第一條資料,它就能正常作業,但一旦我發送另一個輸入,服務器就會以同一資料的兩個實體作出回應,如此類推。我怎樣才能解決這個問題呢?
服務器:
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'/span>, function(data) {
console.log('DATA ' sock.remoteAddress ' :' data) 。
//將收到的資料寫回給客戶端。
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, output: process.stdout
});
var client = new net.Socket()。
client.connect(PORT, HOST, function() {
console.log('CONNECTED TO: ' HOST ':' PORT)。)
//span>繼續回話。
function waitForUserInput() {
r1.question("輸入一些你想發送的資料。", function(data) {
if(data == "exit"/span>) {
r1.close()。
} else {
//將輸入資料寫入服務器。
client.write(data)。
//接收服務器發回給客戶端的資料
client.on('data'/span>, function(server_data) {
console.log('DATA: ' server_data)。
});
setInterval(waitForUserInput, 1000) 。
}
});
}
waitForUserInput()。
});
uj5u.com熱心網友回復:
你不斷添加越來越多的client.on('data', ...)處理程式。 每次你呼叫waitForUserInput(),你最終都會為data訊息添加另一個重復的處理程式。 因此,在呼叫waitForUserInput()兩次后,你有兩個相同的處理程式來處理data訊息,所以當一個新的資料到達時,這兩個處理程式中的每一個都被呼叫,你的控制臺中的輸出出現兩次。 一個資料到達了,但是你有重復的處理程式在監聽它。
您可以使用 .once() 而不是 .one(),或者您可以將監聽傳入資料的處理程式移到函式之外,這樣它就只被安裝一次,而且只有一次。
巧合的是,在這里使用setInterval()也是一個問題,原因有幾個。 你在每次呼叫 waitForUserInput() 時都會創建一個新的間隔計時器,而這與問題的實際回答時間之間并不協調。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/328682.html
標籤:
