NodeJS如何实现真正的长连接?

什么是长连接?

长连接,即:keepalive启用。

通俗的讲:

非长连接状态下,每个请求与服务器通信完毕后,通道就关闭了。再次请求时,还需要重新打开通道。

而如果是长连接,请求完成后,通道在一定时间内不会关闭,再次请求时不需要重开通道,这是就有通信效率上的优势。

NodeJS如何实现真正的长连接?

什么时候适合启用长连接?

1、当web上的静态网页,如:Html、图片、Css、Js居多时,建议启用长连接 。

2、当你的web多为动态请求,比有较多数据库操作。应该关闭长连接,这会节省内存,降低I/O压力。

注意:当长连接开启,KeepAlive =On时,KeepAliveTimeOut的设置其实也是一个问题,设置的过短,会导致频繁建立连接,给Cpu造成压力,设置的过长,系统中就会堆积无用的Http连接,消耗掉大量内存。所以,是否启用长连接,以及长连接超时值是多少,需要根据不同的网站情况而定。

NodeJS编程中的长连接应用场景

在nodejs应用开发中,有多种场景需要控制长连接。

如:web服务器、web客户端、反向代理等。

本例,实现一个简单反向代理,代码如下:

NodeJS如何实现真正的长连接?

运行,看连接状态:

WEB到代理服务器的connection为close,即短连接。

NodeJS如何实现真正的长连接?

代理服务器到client/浏览器,也是close,即短连接。

NodeJS如何实现真正的长连接?

这时,修改代码,在代理服务器向web的连接中,增加agent参数,设置keepalive为true。

NodeJS如何实现真正的长连接?

再运行:

客户端到代理的请求、代理到客户端的连接,都成为keep-alive了,即:长连接。

NodeJS如何实现真正的长连接?

代理到web、web到代理的连接,也都成为长连接:

NodeJS如何实现真正的长连接?
NodeJS如何实现真正的长连接?

即此时,已经实现了完整长连接。

注意,在研究过程中,曾尝试过多种方式,比如手动设定数据包头:

setHeader("connection", "keep-alive");

或者从socket中设置keepalive:

req.socket.setKeepAlive

都是无效或实现效果是残缺的、不是完整的长连接。

猜你喜欢

转载自www.cnblogs.com/w2sft/p/12570779.html