Node.JS教程70:NodeJS如何实现真正的长连接?
什么是长连接?
长连接,即:keepalive启用。
通俗的讲:
非长连接状态下,每个请求与服务器通信完毕后,通道就关闭了。再次请求时,还需要重新打开通道。
而如果是长连接,请求完成后,通道在一定时间内不会关闭,再次请求时不需要重开通道,这是就有通信效率上的优势。
什么时候适合启用长连接?
1、当web上的静态网页,如:Html、图片、Css、Js居多时,建议启用长连接 。
2、当你的web多为动态请求,比有较多数据库操作。应该关闭长连接,这会节省内存,降低I/O压力。
注意:当长连接开启,KeepAlive =On时,KeepAliveTimeOut的设置其实也是一个问题,设置的过短,会导致频繁建立连接,给Cpu造成压力,设置的过长,系统中就会堆积无用的Http连接,消耗掉大量内存。所以,是否启用长连接,以及长连接超时值是多少,需要根据不同的网站情况而定。
NodeJS编程中的长连接应用场景
在nodejs应用开发中,有多种场景需要控制长连接。
如:web服务器、web客户端、反向代理等。
本例,实现一个简单反向代理,代码如下:
运行,看连接状态:
WEB到代理服务器的connection为close,即短连接。
代理服务器到client/浏览器,也是close,即短连接。
这时,修改代码,在代理服务器向web的连接中,增加agent参数,设置keepalive为true。
再运行:
客户端到代理的请求、代理到客户端的连接,都成为keep-alive了,即:长连接。
代理到web、web到代理的连接,也都成为长连接:
即此时,已经实现了完整长连接。
注意,在研究过程中,曾尝试过多种方式,比如手动设定数据包头:
setHeader("connection", "keep-alive");
或者从socket中设置keepalive:
req.socket.setKeepAlive
都是无效或实现效果是残缺的、不是完整的长连接。