长连接

提起长连接,大家就会想到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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值