2016-12-02 65 views
2

這裏是我的回聲服務器代碼爲什麼我的nodejs代碼中的第一個和第二個套接字請求有區別?

var net = require('net')               

var server = net.createServer(function(socket) { 
    socket.write('Echo server\r\n'); 
    socket.on('data', function(data) { 
     console.log('recv data: ' + data); 
     socket.write(data + ' random data'); 
    }); 
    socket.on('end', socket.end); 
}); 

server.listen(1337, '127.0.0.1'); 

這是測試代碼

var net = require('net');               

var client = new net.Socket(); 

client.connect(1337, '127.0.0.1', function() { 
    console.log('Connected'); 
    client.write('Hello, server! Love, Client.'); 
}); 

client.on('data', function(data) { 
    console.log('Received: ' + data); 
    client.destroy(); 
}); 

client.on('close', function() { 
    console.log('Connection closed');  
}); 

當我第一次運行客戶端服務器啓動後,終端顯示:

➜ test node client.js 
Connected 
Received: Echo server 

Connection closed 

我可以看到服務器已經通過wireshark將數據發送到客戶端,但客戶端在此數據包之後立即向服務器發送RST數據包。

第二個是正常

➜ test node client.js 
Connected 
Received: Echo server 
Hello, server! Love, Client. random data 
Connection closed 
+0

FWIW'socket.on('end',socket.end);'是不必要的。 – mscdex

回答

1

在輸出的差異僅僅是由於競態條件。有時服務器能夠在套接字實際完全關閉之前(接收和)發送更多數據,而其他時間則不行。

+0

我可以看到服務器已經在wireshark中發送了回顯數據。是否有可能客戶端沒有收到它? – Devin

+0

這就是我的意思。服務器可能已經發送了它,但是在客戶端的操作系統關閉套接字之前並且拒絕/丟棄之後收到的任何流量。 – mscdex

+0

客戶端可以在刪除'client.destroy();'後接收回顯數據, – Devin

相關問題