2016-12-02 19 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

相关问题