关于web实时通信,通常使用长轮询或这长连接方式进行实现。
为了能够实际体会长轮询,通过Ajax长轮询实现了一个简单的聊天程序,在此作为笔记。
长轮询
传统的轮询方式是,客户端定时(一般使用setInterval)向服务器发送Ajax请求,服务器接到请求后马上返回响应信息。使用这种方式,无论客户端还是服务端都比较好实现,但是会有很多无用的请求(服务器没有有效数据的时候,也需要返回通知客户端)。
而长轮询是,客户端向服务器发送Ajax请求,服务器接到请求后保持住连接,直到有新消息才返回响应信息,客户端处理完响应信息后再向服务器发送新的请求。这样的好处就是,在没有数据的时候,客户端和服务器之间不会有无用的请求。
对于使用长轮询的实现,客户端和服务器都有一定的要求:
客户端发起请求,当接收到服务器响应(正常或异常的响应)后,需要向服务求发送新的请求,从而达到轮询的效果
服务器端要能够一直保持住客户端的请求,直到有响应消息;同时服务器对请求的处理要支持非阻塞模式
实现
例子很简单,客户端使用Ajax进行轮询请求,服务器端使用Python的gevent库来实现了非阻塞式的响应。
客户端
客户端实现了一个longPolling的函数,当文档加载完成后,就会调用这个longPolling函数。
注意Ajax请求的complete属性设置,每次当longPolling函数中的Ajax请求结束后,又会重新通过longPolling函数向服务器发出轮询请求。
http://www.battlenet.com.cn/sc2/zh/forum/topic/17644734313
http://www.battlenet.com.cn/sc2/zh/forum/topic/17644774318
http://www.battlenet.com.cn/sc2/zh/forum/topic/17645044336
http://www.battlenet.com.cn/sc2/zh/forum/topic/17644304301
http://www.battlenet.com.cn/sc2/zh/forum/topic/17644344290
http://www.battlenet.com.cn/sc2/zh/forum/topic/17645044338
http://www.battlenet.com.cn/sc2/zh/forum/topic/17644734317
http://www.battlenet.com.cn/sc2/zh/forum/topic/17644344294
http://www.battlenet.com.cn/sc2/zh/forum/topic/17645044340
http://www.battlenet.com.cn/sc2/zh/forum/topic/17645044342