TCP服务的事件

2020-02-18  本文已影响0人  萘小蒽

《构建TCP服务》的示例中,代码分为服务器事件连接事件

1. 服务器事件

对于通过net.createServer()创建的服务器而言,他是一个EventEmitter实例,它的自定义事件有如下几种:

server.listen(port, function(){
   console.log('listening触发!');
}); 
const server = net.createServer((c) => {
  // 'connection' 监听器。
  console.log('connection,客户端已连接');
);
server.on('error', (err) => {
   console.log(err);
});

2. 连接事件

服务器可以同时与多个客户端保持连接,对于每个连接而言是典型的可写可读Stream对象。Stream对象可以用于服务器端和客户端之间的通信,既可以通过data事件从一端读取另一端发来的数据,也可以通过write()方法从另一端发送数据。它具有如下自定义事件。


3. Nagle算法。

由于TCP套接字(socket)是可写可读的stream对象,可以利用pipe()方法巧妙地实现管道操作,下面代码实现echo服务器

var net = require('net');
var server = net.createServer(function (socket) {
    socket.write('Echo server\r\n');
    socket.pipe(socket);
});
server.listen(1337, '127.0.0.1')

TCP针对网络中的小数据包有一定的优化策略:Nagle算法。
如果每次只发送一个字节的内容而不优化,网络中将充满只有极少数有效数据的数据包,将十分浪费网络资源。
Nagle算法针对这种情况,要求缓冲区的数据达到一定数量或者一定事件后才将其发出,所以小数据包将会被Nagle算法合并,以此来优化网络。这种优化虽然使网络宽带被有效地使用,但是数据有可能被延迟发送。

在node中TCP默认启用了Nagle算法,可以调用socket.setNoDelay(true);去掉Nagle算法,使得write()可以立即发送数据到网络中

需要注意的是,尽管在网络的一端调用write()会触发另一端的data事件,但是并不意味着每次调用write()都会触发一次data事件在关闭掉Nagle算法后,另一端可能会将多个小数据包合并,然后触发一次data事件

上一篇 下一篇

猜你喜欢

热点阅读