毕业设计 web聊天室 怎样判断用户已离线

tom_66 2011-03-06 02:57:26
基本上想好了用struts2 hibernate做,聊天那一块也已经用jquery ajax实现了,
但是不知道有什么好的方法来处理用户退出的问题
用户登陆后将用户加到application中好不好?
怎样在用户点击退出按钮或者关闭浏览器时在在线用户列表中删除用户信息?
等级太低,只能给100分。
如果有这一块的源码,希望能分享一下。
各位大哥大姐,老鸟,高手,帮帮忙吧……
...全文
812 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
qm4050 2011-03-08
  • 打赏
  • 举报
回复
先在web.xml中配好监听器
<listener>
<display-name>StartListen</display-name>
<listener-class>com.zykj.StartListen</listener-class>
</listener>

监听器代码如下:
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.zykj.dao.UsersOper;
import com.zykj.entity.Users;

public class StartListen implements HttpSessionListener{

public void sessionCreated(HttpSessionEvent arg0) {

}

//用户退出session时。但不会马上执行,tomcat默认为30分钟,你可以更改(/conf/web.xml)
public void sessionDestroyed(HttpSessionEvent arg0) {
try {
Users u = (Users) arg0.getSession().getAttribute("user");
UsersOper uo=new UsersOper();
uo.updateStart(u.getUId(), 3);
uo.deleteTemporaryFriend(u.getUId());
System.out.println(u.getUId()+"下线了");

} catch (Exception e) {
e.printStackTrace();
}
}

}
暗然的白天 2011-03-08
  • 打赏
  • 举报
回复
用户放在一个单例集合里、上线给一个状态添加进去,下线给一下状态并移除。页面定时访问这个集合并展示。消息就放在xml文件里吧,格式比较容易读取。
magong 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 fclxyz 的回复:]

晚上结贴,在线用户这一块已经解决了,求聊天这一块思路
[/Quote]
聊天嘛,
得每个客户端主动周期性到服务器取新的聊天文本。
强长黑粗硬 2011-03-08
  • 打赏
  • 举报
回复
聊天功能我是客户端定时提交请求,然后查看有没有发给自己的消息。

至于消息的保存,到DB,放在内存,或者写到文件都随便
ma309385560 2011-03-08
  • 打赏
  • 举报
回复
用定时刷新做聊天功能 有点 建议看看推技术
pang040328 2011-03-08
  • 打赏
  • 举报
回复
首先要弄清楚,离线和下线的定义是不一样的,对于在规定时间内无任何操作的行为定义为“离线”,而关闭应用程序的操作被定义为”下线“。对于下线用户的判断,可以在设计数据库时在user表中加上IsOff字段进行判断,对于离线的判断可以加一个时间戳来判断
zhouluok007 2011-03-08
  • 打赏
  • 举报
回复
聊天这块 最好使用AJAX 做到无刷新效果 个人认为用JSON 对象比MAP好用
liguangwen86 2011-03-08
  • 打赏
  • 举报
回复
session 监听器可以看一下
Cike121272604 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 fclxyz 的回复:]

晚上结贴,在线用户这一块已经解决了,求聊天这一块思路
[/Quote]

聊天思路......麻烦lz说明白点.
Cike121272604 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 woodlikewater 的回复:]

我觉的应该由客服端 通过ajax定时给服务端发送信息。。 表示他在线。。用struts2 action的一个方法提供页面访问,参数为用户id 和sessionid
用一个map<String,Date> 类型来存储当前在线用户 key存储用户id value存储最新更新时间
当用户访问用struts 对应的在线方法时候。 先判断map里面是否存有对应用户id 不存在则加入。。时间为当前……
[/Quote]
嗯,这个公告就是这么干的,在线聊天好像也这么弄,不知道在这里行不行...
G_beginner 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 fclxyz 的回复:]
晚上结贴,在线用户这一块已经解决了,求聊天这一块思路
[/Quote]
聊天的思路?
tom_66 2011-03-08
  • 打赏
  • 举报
回复
晚上结贴,在线用户这一块已经解决了,求聊天这一块思路
强长黑粗硬 2011-03-08
  • 打赏
  • 举报
回复
这个就是说的之前问的那个吧。

算法多种多样,LZ选个合适的就好了,不过我觉得定时刷新,服务器负担会不会很重呀?
不过这种基于http的聊天系统,定时刷新倒是免不了的。


另外大家都说用js判断浏览器关闭。
如果该用户是骨灰级,关闭浏览器是用电源开关的怎么办?
或者在偏远山区,总掉电,这个除非他自己来报道,不然谁也不知道吧。
a619225471 2011-03-08
  • 打赏
  • 举报
回复
学习了
tom_66 2011-03-08
  • 打赏
  • 举报
回复
判断用户是否在线那一块早上已经实现了,是根据昨天说用侦听器的那位高手的意识来弄的
帖子结了
veardn 2011-03-08
  • 打赏
  • 举报
回复
如果用户点浏览器“后退”而不关闭浏览器呢

可以让用户每过一段时间向服务器发送一个特定请求表示该用户正在线,如果服务器有1次没接收到某个在线用户的这个请求,则认定该用户离线
shagan 2011-03-08
  • 打赏
  • 举报
回复
1、等待session过期,具体上面有人讲了
2、浏览器动作,比如窗口关闭时,触发一个事件,再调用logout动作。
3、HTTP是无状态,但可以长连接,一旦连接断了,即logout,可网上查commet技术。Gmail用类似技术
焙焙龙 2011-03-08
  • 打赏
  • 举报
回复
HTTP是无状态的,只能通过Session来模拟状态,所以,服务器对客户端的感知是依赖于发起自客户端的请求的。
要想实现聊天的目的,那么客户端必须往服务器发心跳报文,一来报告自己存活,二来轮询服务器上有无自己的消息,如果有的话就通过response带回。

服务器就是一个瞎子,你喊他他才知道是谁,不能指望服务器去判定客户端是否存活,就好想不能让瞎子去判定刚才喊他的人还在不在
bjliuzg 2011-03-08
  • 打赏
  • 举报
回复
<html>
<script language="javascript">
window.onbeforeunload = function()
{
var n = window.event.screenX - window.screenLeft;
var b = n > document.documentElement.scrollWidth-20;
if(b && window.event.clientY < 0 || window.event.altKey)
{
window.event.returnValue = "";
alert('close');
}
}
</script>

上面是判断IE关闭的例子,在这个方法中取得用户信息,利用AJAX和后台通讯,将该用户的登录状态置成未登录,明白了吗,如果不会ajax的话可以再提问。
iamwhee 2011-03-08
  • 打赏
  • 举报
回复
牛X的session
加载更多回复(24)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧