JavaScript-请教B/S模式下实现服务端消息推送到浏览器
在C/S模式下实现消息推送比较简单,可以用长连接。但在B/S模式下如何实现呢。比如网页聊天室,消息直接推送给浏览器,而不是由浏览器定时向服务端请求。请大家给出解决方案。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在C/S模式下实现消息推送比较简单,可以用长连接。但在B/S模式下如何实现呢。比如网页聊天室,消息直接推送给浏览器,而不是由浏览器定时向服务端请求。请大家给出解决方案。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(6)
http://pushmodule.slact.net
你可以去看看这个nginx的module。 以它来实现Comet。
官方提供了js的例子。
flash + js 也可以,gtalk和facebook用的是comet
自己实现websocket服务,浏览器目前不是都支持websocket,需要考虑兼容性的问题
给你推荐一篇文章:
Comet:基于 HTTP 长连接的“服务器推”技术
如果你的网站用HTML5的话这个问题就不存在了,
但如果不想用HTML5的话就可以以下:
HTML和SOCKET最大的区别是每次HTML都会关闭
所以你知道区别后就可以使用HTML来模拟SOCKET连接。
你可以不关断,但是你要设计自己的消息格式。跟SOCKET编程一样。设计一个自己的数据包的包结构。
客户端每次收到一个数据包不要把inputstream和connection给关了。 直接解析了这个包去回调你的业务逻辑。
等几秒再去读下一个包。
你同样可以像SOCKET编程一样,设计自己的代码和数据结构
两个队列,一个发队列数组,一个收队列数组。
两上线程,一个发送线线程,一个收消息线程。
你的业务逻辑会根据需要把要发送的内容封装成前后台约定的消息包,直接扔到发队列里去。
你的发线程会定时扫描队列里有否有消息包,如果有就利用OutputStream给发过去。
你的收线程会一直KEEP着你的InputStream。记得它原来是怎么读的吧
while(true){
//if is.read() == 你约定的特殊标志
//表示一个包读完了,等待几秒,下次再读
}
从原理上来看,这是不是很像用Http在读一个超大的文件呢?读这个超大的文件你当然不需要关断连接。
如果这个文件分成了N个页面那每次你读到一个分页符的时候你当然可以知道分页标志,所以你可以做点处理。
使用 HTML5 WebSocket 构建实时 Web 应用,在HTML5之前Comet是很好的选择,html5的话可以使用websocket做实时交互