JavaScript-请教B/S模式下实现服务端消息推送到浏览器

JavaScript-请教B/S模式下实现服务端消息推送到浏览器

偏爱自由 发布于 2017-07-18 字数 171 浏览 1110 回复 6

在C/S模式下实现消息推送比较简单,可以用长连接。但在B/S模式下如何实现呢。比如网页聊天室,消息直接推送给浏览器,而不是由浏览器定时向服务端请求。请大家给出解决方案。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

清晨说ぺ晚安 2017-10-25 6 楼

http://pushmodule.slact.net
你可以去看看这个nginx的module。 以它来实现Comet。
官方提供了js的例子。

浮生未歇 2017-09-26 5 楼

flash + js 也可以,gtalk和facebook用的是comet

夜无邪 2017-09-16 4 楼

自己实现websocket服务,浏览器目前不是都支持websocket,需要考虑兼容性的问题

夜无邪 2017-08-05 2 楼

如果你的网站用HTML5的话这个问题就不存在了,
但如果不想用HTML5的话就可以以下:

HTML和SOCKET最大的区别是每次HTML都会关闭
所以你知道区别后就可以使用HTML来模拟SOCKET连接。

你可以不关断,但是你要设计自己的消息格式。跟SOCKET编程一样。设计一个自己的数据包的包结构。

客户端每次收到一个数据包不要把inputstream和connection给关了。 直接解析了这个包去回调你的业务逻辑。
等几秒再去读下一个包。

你同样可以像SOCKET编程一样,设计自己的代码和数据结构
两个队列,一个发队列数组,一个收队列数组。
两上线程,一个发送线线程,一个收消息线程。

你的业务逻辑会根据需要把要发送的内容封装成前后台约定的消息包,直接扔到发队列里去。
你的发线程会定时扫描队列里有否有消息包,如果有就利用OutputStream给发过去。
你的收线程会一直KEEP着你的InputStream。记得它原来是怎么读的吧
while(true){
//if is.read() == 你约定的特殊标志
//表示一个包读完了,等待几秒,下次再读
}

从原理上来看,这是不是很像用Http在读一个超大的文件呢?读这个超大的文件你当然不需要关断连接。
如果这个文件分成了N个页面那每次你读到一个分页符的时候你当然可以知道分页标志,所以你可以做点处理。

虐人心 2017-07-28 1 楼

使用 HTML5 WebSocket 构建实时 Web 应用,在HTML5之前Comet是很好的选择,html5的话可以使用websocket做实时交互