与Bosh相关的一些文章

1. http://shallon.iteye.com/blog/126428
针对Bosh作了很通俗的讲解
2. http://www.jabbercn.org/XEP-0124
xmpp的文档有Bosh的详细介绍
3. http://www.ibm.com/developerworks/cn/web/wa-lo-comet/
IBM针对Comet的介绍

简单点说Bosh就是
服务器阻塞客户端的请求 一直到有数据要发给客户端 (或Timeout其实Timeout也会发数据给客户端)
有数据时服务器就通过这个阻塞的请求返回数据。 客户端在得到数据后又发送新的请求到服务器端。服务器端又会阻塞这个请求(个人认为这个请求服务器会接收数据,但不会返回。后面可以看到其实这里是有2个请求的)。

不过情况并不是这么简单,因为:
服务器会给客户端发数据,客户端也应该可以给服务器发消息。

所以这个时候客户端会发一个新的请求req2(也就是客户端会有2个请求一个被服务器阻塞req1用于返回数据,另一个req2用于发送数据给服务器)
在服务器得到数据后,服务器会马上通过被阻塞的请求req1返回数据给客户端(没有数据会返回空包给客户端),
此时之前用于客户端发送数据的请求req2成为了被阻塞的请求req1'。

此时 1. 如果客户端要发送新的服务器,就必须发送一个新的请求req2'。然后就上面的一致了。
       2. 如果客户端当前不发送新的数据,也会发送一个新的请求req2',这样可以保证客户端在要发送数据时可以立即发送数据给服务器。
      所以这里其实有一个角色转换。新的连接用于客户端发送数据,老的连接用于服务器发送数据。

后来一想,应该2个请求都是阻塞的,只是服务器用第一个(相对比较早生成的一个连接)请求返回而已.

目前还有一个问题,连接Timeout问题
文档中
引用
如果在一个规定时间内(通常是几分钟)两个方向上都没有流量, 那么连接管理器以无数据来应答客户端, 并且那个应答立即触发一个新的客户端请求. 连接管理器这么做来确认是否网络连接已经中断,并且双方都在一个合理的时间内明白到这一点. 这一交换类似大部分持久TCP连接中的通用的 "keep-alive" 或 "ping" . 因为BOSH技术未使用轮询, 带宽消耗不会比标准TCP连接大很多.

这个说得很清楚!

纯个人作品,不喜勿喷!欢迎交流!

猜你喜欢

转载自billyyuan.iteye.com/blog/1855691