个人观点:
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.   

    我想不是用jsp做的吧?
    应该是用asp做的,你可以参照下以前很流行的热狗,和那个差不多的,看过asp的语法,你就会用jsp写了,热狗你可以在www.baidu.com上搜索,应该可以找的到它的源码的
      

  2.   

    <META http-equiv="refresh" content="3; url=http://..../">
      

  3.   

    定时刷新页面
    <meta http-equiv="refresh" content="1000;url=yoururl">(1秒刷新一次)
    但我分析了一下csdn对短消息的处理,虽然它在页面也加了这样的设置,但实际上也并不是即时的显示有短消息到达,它还是在页面载入和刷新时处理的(这只能说明那个设置没起作用)。你可以做一个测试,给自己发一条短信息,看看是不是立即有显示,然后刷新页面在看一下,你还可以看一看它的代码,从中可以推测出它是怎么做的
    另外,有短消息的闪烁效果用一张gif图做更简便。
      

  4.   

    请大家帮帮忙啊!我做了测试,就是不能定时刷新,
    <meta http-equiv="Refresh" content="1000;URL=testduanxin.jsp">
    还有别的要设的吗?
      

  5.   

    按理说<meta http-equiv="refresh" content="1000;url=yoururl">就是设置定时刷新的,但为什么不起作用,我还不清楚
    实在不行,可以自己编代码实现,如
    <script language=javascript>
    setInterval("location='your url'",1000);
    </script>setInterval(action,time):每隔time毫秒执行action动作
      

  6.   

    同意楼上,不用说多个用户,就是一个用户这么操作,服务器也会被忙坏的,csdn选择这么做是有它道理的
      

  7.   

    通过设置read字段解决,你仔细看一看上面的内容吧
      

  8.   

    zxhong,以前的贴子,现在看不到了,麻烦你能不能再说一次呢!非常感谢!
      

  9.   

    哦,我觉得freefalcon(心宇) 说的很好啊!
    你还有什么不满意的?
      

  10.   

    哦,那就在刚登进时,或手动刷新时显示出来。
    除此以外,我好象在那见过用IFrame实现的(隐藏,刷新该页)
    具体我也不清楚了!
    不好意思了:)
      

  11.   

    定时刷新
    <meta http-equiv="Refresh" content="1000;URL=testduanxin.jsp">
    1000//是1000秒呀。哈哈。
      

  12.   

    有read字段不假,但是判断是否阅读,得有个标准。怎么做?即你得程序怎么判断这个用户已经读了短信,然后就给read赋值?
      

  13.   

    我是这样想的,刷新的那个页面只负责刷新,同时检测是否有新的短信息,如果有就调用一个新的页面,在那个新的页面里更新read值。这样,只要这个页面被弹开,就说明这个页面被用户看了。
      

  14.   

    我回来了,这次带给大家一个好东西。先纠正一个问题<meta http-equiv="Refresh" content="1000;URL=testduanxin.jsp">
    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>以上两个页面就是即时短消息的最核心的“机密”。
      

  15.   

    to:krack2002()
    在用户阅读短消息的页面里将read字段置为true就行了
      

  16.   

    请原谅我的无知吧... 上面那个方法是能用.
    但是我还是有个问题,那就是如果有很多用户的话,那么服务器是否能够承受得了.
    因为这样每刷新一次,就和数据库连接一次. 可能一个两个就不觉察.但是有时候网站的访问量很大的话. 这样开销也太大了吧.
    我以前也试过做这个东东,定时刷新. 结果就是要过一段时间,就要重新启动服务器. 数据库也要重新启动一次.
    用连接池的话,也很容易造成内存不足. 还有用udp的话. 这样也变成复杂一些了.
      但是我也实在想不出有什么好的办法能解决这些问题. 我还是想看看还有谁能用别的方法能解决这个.   
      

  17.   

    非常感谢大家的帮忙。
    我现在做的也是基于这样的机制,
    这样做是存在系统访问量的问题。
    所以我想问问在java中有没有发消息这种机制呢?或是说有没有通过IP来发送消息的呢?
      

  18.   

    我想应该能吧!有谁知道EJB中的JMS