关闭

长连接

684人阅读 评论(0) 收藏 举报
分类:

提起长连接,大家就会想到ajax轮询以及http long polling(长轮询),但这两种都是人为模拟的假像:

ajax 轮询:

ajax轮询的原理非常简单,就是让浏览器每隔一段时间就发送一次请求,询问服务器是否有新信息。

浏览器:有新消息没(request)。

服务器:null(response)。

浏览器:有新消息没(request)

服务器:木有(response)

......


http long polling:

也是轮询,不过采取的是阻塞模型,如果服务器没有新消息那么就不会返回,直到有新消息才会结束这次握手,然后客户端再次发起下次。

客户端:有新消息没(request)

1秒

2秒

...

100 秒

服务器:你妹是我妹(response)

客户端:有新消息没(request)

......


从上面的简介可知,这两种都是假长连接,而且,ajax轮询需要服务器快速响应,而长轮询需要有较高的并发,都对服务器的资源有很大的耗费。



HTML5引进了一种新的协议WebSocket,它跟http协议一样,都是基于 TCP 协议的,他们两者之间的唯一关联就是,WebSocket协议使用了http协议中的握手,客户端会向服务器发送一个标记为Upgrade的http请求,告诉服务器我是贵宾,你要升级接待标准,然后服务器response一个101状态给客户端,告诉客户端我准备好了,之后的通信就跟http协议没有半毛钱关系了。

WebSocket只需要实现一次连接(http需要轮询),就可以一直双向通信(http协议就太被动了只有pull服务器才响应,而WebSocket既有pull也有push),直至你自己关闭请求。

客户端:我要建立Websocket协议,而不是吐了吧唧的http
服务端:ok,确认,已升级为Websocket协议
客户端:麻烦你有信息的时候推送给我噢。。
服务端:ok,有的时候会告诉你的。
服务端:balabala
服务端:balabala
服务端:balabala
服务端:balabala


WebSocket也有自身缺陷的,因为它需要跨越无数的路由器、防火墙等等来长久维持连接,有许多不可预测的事情,如这些坑爹的中间节点可能会认为一份连接在一段时间内没有数据发送就等于失效,它们会自作主张的切断这些连接,而无论客户端还是服务器都察觉不到,只能相互徒劳地发送数据。当然了,WebSocket也有应对之策,让服务器和客户端相互发送 Ping/Pong Frame数据包,来维持连接。


WebSocket在Android中的应用,可以使用autobahn0.5.0.jar这个包来实现,这就很简单了,不再详叙!




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:24921次
    • 积分:332
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:4篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论