日期:2014-05-18  浏览次数:20660 次

B/S 模式下实现即时消息通讯~~~~

  近端时间一直在研究使用 Java 来实现即时通讯, 意思就是说如果有一个用户给另一个用户发送消息,这个用户可以及时收到这个消息,并在页面上弹出一个对话框什么

  的。 但是没有一个很好的实现方法, 有人说 C/S 模式下可以使用 socket 来实现,我想在 B/S 模式下实现这样的功能。 我想不能用 http 实现, 因为 http 是无

  状态的连接, 是否可以使用 TCP 长连接来实现呢? 谁可以提供一下思路或者代码。 


  定时刷新页面,去检索数据库中的数据,这样消耗的资源挺大的, 我想有没有其他的方法来实现呢,欢迎各位高人、牛人一起来讨论下, 我想这也是大多人的疑惑吧!!

------解决方案--------------------
发送消息->服务器内存->接收消息,定时刷新,取服务器内存中的消息.接收后,所接收的消息保存入服务器数据库,状态为已经读
*
|
一个线程在监视服务器内存消息,如果超过规定时间没有接收的,从内存中删除,存入数据库,状态为未读

第一次接收消息时,检查数据库中是否有未读消息,也可以把已读和未读两种消息分开两个表来存放。

这样,用http实现,每都都出新,符合B/S,结合ajax非常好用;定时刷新,检查的是服务器内存,压力不是很大。内存区可以定义缓冲区大小,排队接收,这样就可以了。
注:B/S就是浏览器模式,不存在TCP 长连接,所以用TCP长连接实现是不现实的。

另一种方案就是网页插件+socket或用applet+socket,或用flash+socket,但要纯B/S实现就要ajax+http+定时刷新这种非实时的消息传递,只不过不存在你所说的服务器压力问题。
写了一大套,拿分来。
------解决方案--------------------
DWR的服务器推进功能可以考虑,而且页面无刷新
服务器内数据更改,服务器自动将其推到客户端显示,客户端页面无刷新
------解决方案--------------------
如果你想在BS结构,且不用ajax来刷新做即时通讯。你先思考几个问题:
1、客户端是浏览器,如果客户端没有连接或者打开你的聊天界面,那么,你写的聊天是否能自动让它运行呢?我想是不行的吧。
2、大家都知道浏览的异常关闭问题。

3、你所说的TCP在连接一段时间,如果没有响应,会自动关闭连接的,确宝资源不浪费。不过你所说的TCP怎么来实现通讯,偶也不懂,只知道其连接的协议。

个人认为你所要实现的那种理想效果很难实现,不知道其他高手有超人的思维?

------解决方案--------------------
我也一直被B/s即时通讯的问题困扰着,帮lz顶顶吧!
------解决方案--------------------
探讨

感谢你的回复, 首先我要说下, 我说了不要页面刷新那种, 要是那种,早就做出来了, 何必要拿来问人呢! 在说有的 OA ,还有这个 CSDN 上的都是可以实现这样的功能的, 不用刷新, 就可以监测到消息。


------解决方案--------------------
DWR,你可以去下个DWR包来看看,
http://download.csdn.net/source/1121915
DWR用来做即时通讯很方便
这里很方便的,不要去想用socket或者定时刷新了!这不太现实.
------解决方案--------------------
DWR的推送不需要每一个页面都向后面发送请求,而是后台接收到某个页面的请求再将反馈信息发送给其它的页面!
------解决方案--------------------
探讨
引用:


  感谢你的回复, 首先我要说下, 我说了不要页面刷新那种, 要是那种,早就做出来了, 何必要拿来问人呢! 在说有的 OA ,还有这个 CSDN 上的都是可以实现这样的功能的, 不用刷新, 就可以监测到消息。



实际上,没有真正的不刷新技术,只是现在的刷新都用AJAX来做,用户感觉不到罢了。
其实还是定期向后台发出请求。

------解决方案--------------------
探讨

只能这样吗?

------解决方案--------------------
没做过java
up
------解决方案--------------------
.
------解决方案--------------------
Ajax把页面和后台链接起来,页面不刷新也可以定期跳出对话框!
底层建立socket的长连接,并服务器端监控心跳,没有心跳的话就重新建立一个链接,其实大部分的性能消耗在建立连接上,这样做就不会消耗太多的性能了
------解决方案--------------------
1用applet
2基本原理仍是定时刷新 不管外壳怎么变
3可以研究下服务器推技术

不刷新的想法是好的 但那就像不拨号就能打的手机一样 至少目前还没有
------解决方案--------------------
用 Flash + XmlSocket 可以做到
------解决方案--------------------
不想刷新就只能用 AJAX了,实时通讯一半在网页中就这样了!
(例)就好像SINA的NBA上记分牌一样!
------解决方案--------------------
没实现过,但是这篇文章讲的很不错
http://www.ibm.com/developerworks/cn/java/j-jettydwr/
------解决方案--------------------
学习了!
------解决方案--------------------