个人观点:
1.数据库中创建一个Message表,包括字段id(主键),to(接收人),from(发送人),message(消息),time(发送时间),read(是否阅读过)
2.当发送人发送消息时,将各数据记录入库,read标志为false;
3.主页面(显示是否有短息的页面),定时刷新,检查用户的id是否存在于Message表中to字段中,若存在并且read为false则表示有新的短消息,于是提示有短消息
4.有短消息时的闪烁效果,可以用图片的隐藏来实现,如下:
<%boolean hasMessage=false;//hasMessage通过查询数据库得到%>
<img id=msg src="message.gif" style="visiblity:hidden">
<script language=javascript>
var show=<%=hasMessage?true:false%>;
if(show)setInterval("showMsg()",1000);
function showMsg(){
if(msg.style.visibility=="hidden")msg.style.visibility="visible";
else msg.style.visibility="hidden";
}
</script>
5.用户阅读过短消息后,将read置为true;
6.查看time字段,时间过了一周,删除短消息
1.数据库中创建一个Message表,包括字段id(主键),to(接收人),from(发送人),message(消息),time(发送时间),read(是否阅读过)
2.当发送人发送消息时,将各数据记录入库,read标志为false;
3.主页面(显示是否有短息的页面),定时刷新,检查用户的id是否存在于Message表中to字段中,若存在并且read为false则表示有新的短消息,于是提示有短消息
4.有短消息时的闪烁效果,可以用图片的隐藏来实现,如下:
<%boolean hasMessage=false;//hasMessage通过查询数据库得到%>
<img id=msg src="message.gif" style="visiblity:hidden">
<script language=javascript>
var show=<%=hasMessage?true:false%>;
if(show)setInterval("showMsg()",1000);
function showMsg(){
if(msg.style.visibility=="hidden")msg.style.visibility="visible";
else msg.style.visibility="hidden";
}
</script>
5.用户阅读过短消息后,将read置为true;
6.查看time字段,时间过了一周,删除短消息
应该是用asp做的,你可以参照下以前很流行的热狗,和那个差不多的,看过asp的语法,你就会用jsp写了,热狗你可以在www.baidu.com上搜索,应该可以找的到它的源码的
<meta http-equiv="refresh" content="1000;url=yoururl">(1秒刷新一次)
但我分析了一下csdn对短消息的处理,虽然它在页面也加了这样的设置,但实际上也并不是即时的显示有短消息到达,它还是在页面载入和刷新时处理的(这只能说明那个设置没起作用)。你可以做一个测试,给自己发一条短信息,看看是不是立即有显示,然后刷新页面在看一下,你还可以看一看它的代码,从中可以推测出它是怎么做的
另外,有短消息的闪烁效果用一张gif图做更简便。
<meta http-equiv="Refresh" content="1000;URL=testduanxin.jsp">
还有别的要设的吗?
实在不行,可以自己编代码实现,如
<script language=javascript>
setInterval("location='your url'",1000);
</script>setInterval(action,time):每隔time毫秒执行action动作
你还有什么不满意的?
除此以外,我好象在那见过用IFrame实现的(隐藏,刷新该页)
具体我也不清楚了!
不好意思了:)
<meta http-equiv="Refresh" content="1000;URL=testduanxin.jsp">
1000//是1000秒呀。哈哈。
1000是1000秒,我记成毫秒了,谢谢 redv(想不出来,就出去转转) 前两天看一个朋友说计算机世界论坛(http://www.dev-club.com)
的短消息很“即时”,于是特意跑到那儿申请了一个账号,看了一下,其实原理和我们上面的分析是一样的,只是它的刷新时间短一些,好像是3秒钟,而且有短消息到时是弹出一个小窗口。但据那里的朋友反映,最近的短消息不即时了,想必也是因为服务器压力太大而延长了刷新的时间,另外还有一个问题,如果你在玩游戏,比如cs,飞车之类,短消息弹出的窗口可能会造成游戏暂停或死机。下面就是那里的开发人员写的文章,他们用的是asp,jsp原理与此一样,大家该清楚了吧!====================================================================
即时消息原理 <linda_wu 于 2002-10-29 9:48:47 >如今,网络已经不仅仅知识代表技术了,它已经深入了大家的生活,满足人们交流的欲望。为此许多的网络社区也像雨后春笋搬的涌现,如网易社区、逸飞岭、第九城市等。这些社区中有一个很有趣的功能——即时短消息,你可以给在社区内的网友留言。而你的网友只要在线,他不必点击查看留言,也不管他正在社区的什么位置,每当有新的留言,系统自动会提醒他是否查看,就像用手机发短消息一样。我收到很多网友来信,询问这是怎么做的。其实这个功能实现起来相当简单,只要用一点点HTML和ASP(PHP等其他动态脚本语言也行)知识就可以了。不信?走着瞧!兵马未动,粮草先行,建立数据库先,简便起见就用Access数据库啦。建立一个名叫db.mdb的数据库,其中的tb_msg表结构如下:
字段名 长度及类型 说明
fd_sender C(20) 发送即时短消息人在社区中的名字
fd_getter C(20) 接收即时短消息人在社区中的名字
fd_msg C(100) 短消息内容
fd_isread Int 零表示没有读过,非零表示读过用户一旦发送了短消息后就将收信人的名字记录存入fd_getter字段,把自己的名字存入fd_sender字段,内容存入fd_msg,并且将fd_isread设置为0。
有了数据库,我就要讲原理了,其实这个原理就是隐藏帧外加定时刷新。所谓隐藏帧在本文中指的是高度为0的帧,用户肉眼看不见(如图1,pic01.gif)。这个帧中含有一个检查是否有新的短消息的页面checkmsg.asp,这个页面通过定时刷新,来检查tb_msg中有没有fd_getter为本用户并且fd_isread为0的记录,如果有就用showmsg.asp显示,否则就不做什么。这就是网站即时短消息最大的秘密!既然明白了原理,那么就让我们亲自来实现一次吧。图1中main.htm源文件如下:
<html>
<head>
<title>即时短消息</TITLE>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
</head>
<frameset border=0 frameborder=0 frameSpacing=0 rows=0,*>
<!--下面一行就是隐藏帧-->
<frame name=Message noResize scrolling=no src=checkmsg.asp>
<frame name=Normal noResize src=normal.htm>
<noframes>
<body>
<p>本页使用了框架,但是您的浏览器不支持。</p>
</body>
</noframes>
</frameset>
</html>normal.htm页面随意,和本例没有什么关系,不再多说。关键的checkmsg.asp源文件如下:<% Option Explicit %>
<%
'adovbs.inc是MS的一个系统提供的INC,用于数据库操作
%>
<!-- #include virtual="/adovbs.inc" -->
<html>
<head>
<meta http-equiv='refresh' content='10; url=checkmsg.asp'>
<!--10表示每10秒刷新一次,url=checkmsg.asp表示要刷新的页面-->
<title>aaaaa</title>
</head>
<body bgcolor=#ffffff leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<%
'从Cookies中取得收信人的名字,本文假设用户登录到该网站时,网站将用户名存放到cookies中。
dim ram_getter
ram_getter=request.cookies("username")'连接数据库
dim conn
dim connstr
connstr="DBQ="+server.mappath("/db.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
set conn=server.createobject("ADODB.CONNECTION")
conn.open connstr'检查数据库中有没有收信人是当前用户并且fd_isread是没有读过的记录
dim rs
dim sql
set rs=server.createobject("adodb.recordset")
sql="select * from tb_msg where fd_getter='"&ram_getter&"' and fd_isread=0"
rs.open sql,conn,adOpenKeyset,adLockReadOnlyif rs.recordcount>0 then
response.write "<script language=JavaScript>window.open('list.asp','newwin')</script>"
end ifrs.close
conn.close
set rs=nothing
set conn=nothing
%>
</body>
</html>以上两个页面就是即时短消息的最核心的“机密”。
在用户阅读短消息的页面里将read字段置为true就行了
但是我还是有个问题,那就是如果有很多用户的话,那么服务器是否能够承受得了.
因为这样每刷新一次,就和数据库连接一次. 可能一个两个就不觉察.但是有时候网站的访问量很大的话. 这样开销也太大了吧.
我以前也试过做这个东东,定时刷新. 结果就是要过一段时间,就要重新启动服务器. 数据库也要重新启动一次.
用连接池的话,也很容易造成内存不足. 还有用udp的话. 这样也变成复杂一些了.
但是我也实在想不出有什么好的办法能解决这些问题. 我还是想看看还有谁能用别的方法能解决这个.
我现在做的也是基于这样的机制,
这样做是存在系统访问量的问题。
所以我想问问在java中有没有发消息这种机制呢?或是说有没有通过IP来发送消息的呢?