微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Ajax long polling实现简单的聊天程序

关于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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐