用java,想写一个web聊天的应用,使用session来储存当前用户吗?还是用线程?聊天记录放在哪里?

如题,想写一个web聊天的应用,使用session来储存当前用户吗?还是用线程?一个用户对应一个session的话当前电脑同一个浏览器不是就不能使用了吗?如果是线程的话是一个线程处理多个用户还是一个用户起一个线程,又是如何实现的呢?求高手解答?另外web聊天的记录应该不是存在数据库中的吧,那数据放哪?好像有什么推送功能,能具体讲一下吗?用java写。

这个我刚刚研究说。如果信息是实时的,那就复杂了。
简单的说,网页上的实时聊天都是刷出来的,就是客户端不停的提交请求给服务器,看看有没有最新信息。我也是刚开始学,所以性能上好不好我说的不一定对。只是个人看法。
最新的有web socket,据说这个性能上不错,不过我试过了,ie浏览器的支持不好,好像10以后才支持,我测的8不行。火狐用着不错。
先说传统的ajax吧,最笨的实时聊天的方法就是定时用ajax刷,也就是5秒钟刷一次,看看服务器里有没有新信息,ajax能给人一种静态刷新的体验,就是网页不用刷新,新内容自己就蹦出来了。但是呢,非常明显,如果用户没在操作就在这挂机呢,或者没有新信息的时候,ajax发送了很多无用的请求。

至于这个推技术,我就看了dwr的推技术。有前辈说这个也是逃脱不了刷这个模式,只不过是封装了一下。具体我没研究。找了个demo自己测了一下。同一个浏览器打开的时候会产生一个session,也就是不管你在一个浏览器上打开多少窗口,你这个sessionid都是唯一的。同一个站点同一浏览器登录多账号,这个需求本身就不合理,这不明摆着让用户开小号呢么。先不说这个了,正题:
在我找的这个demo里,用户身份是用sessionid区分,一对一的会话里,是要把所有session都遍历一遍找到接受者的id,然后给这个页面“推”。这个推你找个例子就明白了,它是可以在java底层里面直接刷页面的。具体怎么实现,都有函数的。页面怎么刷就不用管了,dwr都封装好了。
我也在纠结这个聊天记录放到哪,人人网的聊天是入库的,和留言板是一个功能,只不过聊天的都是悄悄话。像58同城就不是入库的。
我想过用session,但是如果用户很多的话,很占内存,内存溢出了就什么都没了。如果放cookie里,单个站点的cookie有大小限制的,好像是4K(忘了在哪看到的了)。
或者放数据库里吧,如果不想存太多的话就定时清一下。其实也不麻烦的,用户的在线状态你是怎么保存的?我测的时候,如果浏览器关闭,session其实是没清除的。总要定期检查用户是否在线吧,session如何回收还要配置一下。
我想了一个方法把聊天窗口写成一个iframe,不过还没实施。

还有用长连接和flash的,不好意思我水平不够,没看懂
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-17
如果用udp一类的话,会话不能保证得自己手动实现(用JS操作cookies来保证通讯上下文)

如果用http请求的话,会话的事情就不用考虑了,只要考虑你服务器对外的服务就行了。

用JS的异步请求一类的就可以实现前台效果了,你问的线程不知道你是说的啥东西。。。?

WEB服务器上本身就是多线程的了。。。

聊天记录存数据库,推送是用代码实现的消息列队,前台以一个周期性的向服务器索取消息列队,返回值为空,或非空,当非空时,前台再使用一个新的协议获取具体的消息列队,用这种方法来实现。

难点在于,要考虑通讯失败的情况,用户来申请推送消息时,你下发了,但是用户没收到,同时服务器认为用户收到了。。。会导致这些推送消息,用户永远收不到
第2个回答  2013-10-17
使用session存储当前用户,一个电脑的浏览器只能登录一个用户(qq就是这样,你可以登录两个QQ登录下空间看看效果),一个用户一个线程的话当然是不行的,你的服务器承受不了, 再说这样也浪费资源,所以现在都是用的NIO模式处理请求的。数据你可以存放在数据库、文件、内存,这个要视情况。推还是拉就要看你想怎么处理了。
第3个回答  2013-10-17
如果你要在一个浏览器里面,可以登录多个用户,那么你就应该使用page来记录登录用户的信息.

但是,一般不会这样做是有原因的。因为如果你在该网站上面,打开另一个窗口,则又要把page的信息复制过去等等。。后台处理也稍麻烦
第4个回答  2013-10-17
web的话一般用session,至今没发现一个浏览器能登录同一个网站的多个账号。
聊天记录放在数据库,可以使用java NIO框架的socket通信
相似回答