web在线聊天室该怎么做呢?

2013-07-22 10:19:44 +08:00
 2656618087
本程序员想做个在线聊天室。能放在公网上的。现在不知道用什么实现方式。项目是javaee的 JSP项目。请有相关经验的前辈指点一二!
现在小程序员有看过DWR,servlet3.0配合前台ajax,发现都能实现,更倾向与servlet3.0的异步服务器推,但是看到有个网站用的这种方式实现,结果聊天室经常出问题。请前辈们帮忙分析分析,该用什么实现呢!最好是支持人数多、性能好的! 小弟先谢过了!
12842 次点击
所在节点    程序员
51 条回复
nybux
2013-07-22 11:05:48 +08:00
我实现的是http长连接推送的,用golang实现的,由于测试程序的性能问题,测试了2万个并发没有问题。
lidashuang
2013-07-22 11:07:04 +08:00
websocket
lch21
2013-07-22 11:11:32 +08:00
现在都用QQ, 微信聊天, web聊天室很少人用了吧
网上也有不少开源的web聊天室程序
2656618087
2013-07-22 11:17:29 +08:00
@nybux 我写了个前台ajax,进入聊天室时通过ajax(startComet一个函数)开始长轮训,目的是请求后台使此用户请求加入到后台用户列表中,此请求就一直挂起,等待有消息推过来 再执行success方法 处理接收到的消息,complete后再发出下一次轮询请求,以此循环。 有个sendmessage函数是负责发送消息的,后台收到此请求,通知列表用户并发送消息至前台。现在主要问题是后台我不知道该怎么写,想用servlet3.0的异步对象AsyncContext 将每个用户的AsyncContext对象缓存起来 就相当于用户列表。但是具体不知道怎么写 怎么入手。能指点下么?给点代码片段 看看可否!谢谢了
2656618087
2013-07-22 11:18:16 +08:00
@lch21 我没找到合适我的!之前看了个开源的auto-comet 但是他不更新 我也没细看!
2656618087
2013-07-22 11:19:39 +08:00
@lidashuang 能讲讲实现思路吗?
还有个问题就是 我想着这东西不复杂 估计会写的人 一天就搞定了!但是我后台不会写 都琢磨了好久了 没写出来!
nybux
2013-07-22 11:24:30 +08:00
你的程序里面要存储一张表,就是对应的用户id和asynccontext的表。
当要给指定用户发消息的时候,就通过用户id把对应的asynccontext对象取出来,返回发送消息。
我用golang写的。用的是channel阻塞。原理和asyncservlet不太一样。
2656618087
2013-07-22 11:35:59 +08:00
@nybux 我的聊天记录不保存,我之前简单做了个用户id和asynccontext在一个javabean asynUser里保存,然后用一个map存放key为房间id value是一个list里面就放的是此放假所有的asynUser对象,但这样老出问题,并发问题、还有就是发送消息时还没给这个房间的asynccontext发送完,下一条消息已经到达,就导致部分用户接收不到消息。对java的同步、锁什么的不太了解 这块也不到底是不是这样处理的。最烦的就是asynccontext对象 相当于发一次消息 就销毁一次 接着ajax轮询请求,后台再创建个asynccontext对象。麻烦的
nybux
2013-07-22 12:01:31 +08:00
并发问题是程序逻辑写的不合理,要好好再设计一下。这类程序的开发,我一般都是2线程的,一个线程负责网络收发,一个线程负责业务逻辑。所以在业务这块,我是单线程的,一般来说仅仅是聊天转发,一个cpu core足够处理了,而且也没有锁的问题。
参考资料:http://www.eecs.harvard.edu/~mdw/proj/seda/
2656618087
2013-07-22 12:19:22 +08:00
@nybux 好的 谢谢 我看看
armin
2013-07-22 12:25:22 +08:00
Yuansir
2013-07-22 13:58:17 +08:00
试试 socket.io
xdeng
2013-07-22 15:07:22 +08:00
@nybux go版发来玩玩啊
thursday
2013-07-22 15:27:21 +08:00
nodejs socket.io 很简单
verfino
2013-07-22 16:28:23 +08:00
用浏览器实现 确实推荐下 Node.js的socket.io
paloalto
2013-07-22 17:36:35 +08:00
2656618087
2013-07-22 17:54:51 +08:00
@thursday 不太会这玩意!入门资料提供吗?
hoorace
2013-07-22 18:23:29 +08:00
使用node.js + socket.io比较快就做出来的,网上的demo也比较简单可以帮助你。只是浏览器的兼容问题需要改写一些框架的源码;由于node的内存回收机制不太清楚,outofmemory的情况时有发生。如果业务量不大或者练手,可以考虑。
目测小米的客服也是node.js开发的!
我参与了okhqb.com的右侧的联系客服,是node.js+socket.io+redis开发的!
verfino
2013-07-22 18:25:33 +08:00
@hoorace Node.js 的 socket.io 貌似对浏览器近乎是全兼容的....(ie6,7,8 chrome firefox safari)
hoorace
2013-07-22 18:27:36 +08:00
@verfino 用了你就知道了,某些浏览器的一些细节,需要你修改socket.io的源码。我至少修改过3处。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/76549

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX