[原创]超级经典聊天室系统实现 Ajax+PHP+Javascrcript+Json无刷新技术倾力打造(二)

      接上文,我们提出了实现聊天室必须要解决的问题,下面我们来一起探讨下,这些问题将如何解决。

       1)关于数据存储的问题。 数据存储可以采用多种形式,如:xml、写入文件,在其他语言中还是可以用application这个全局变量,而在PHP中没有这个全局变量,需要自己封装,还用使用数据库存储数据。本人比较懒惰,呵呵,使用数据库技术实现对数据的存储,这样即有利于数据的永久保存,更方便我们书写代码。

        2)数据显示的问题。数据显示的问题也可以通过多种方法来实现,比如:可以定时让网页刷新,每次刷新从数据库中读取数据,但是这种方法的最大问题是,每次可能会从数据库中取出所有的聊天信息,这样效率太差了。如果同时有几百个人同时在线,那么这个聊天室就会很慢很卡了,还有一种技术是采用Ajax技术实现局部刷新技术,动态的读取所需要的数据,这里应该说明一点要,实现聊天室一定要考虑性能、效率问题,所以读取数局决不能读取所有数据,而是要每次读取最后一条或者几条最新的数据...
我的这个聊天室已经实现这部分,请大家继续往下看。

       3)判断用户何时在线,何时离线。我们的在线用户列表中显示的是在线的用户,那何时判断用户在线情况的呢,我们这里是这样处理的,首先当用户进入聊天室的时候,需要初始化聊天室信息,以后每隔一段时间读取一次数据库,而我正是利用这点每次把用户的IP插入和当前时间插入到数据库中,当然,当当前用户IP已经存在当前表中,则我直接更新用户的最后一次登录时间,所以当用户没有离开这个页面,我都认为是在线。否则的情况是离线,离线的时候应该从用户在线表中删除当前用户的信息,最后把所有的用户显示到在线列表中。

      4)聊天室的一些特殊的处理。这里特殊处理包括当文字内容特别多的时候,会出现滚动条,让滚动条跟随内容滚动到底部,处理一些快捷键,直接可以发送信息等。

下面直接看源码:

聊天室登录页面

Code:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  2. <html xmlns="http://www.w3.org/1999/xhtml">   
  3. <head>   
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />   
  5. <title>欢迎使用AJAX聊天室</title>   
  6. </head>   
  7.   
  8. <body>   
  9. <form action="chatindex.php" name="form1" method="post">   
  10. <table width="400" border="1" align="center">   
  11.   <tr>   
  12.     <th height="52" colspan="2" scope="col">欢迎使用AJAX聊天室</th>   
  13.   </tr>   
  14.   <tr>   
  15.     <td width="107">用户名:</td>   
  16.     <td width="277"><input type="text" name="username" /></td>   
  17.   </tr>   
  18.   <tr>   
  19.     <td>密 码:</td>   
  20.     <td><input type="password" name="password" /></td>   
  21.   </tr>   
  22.   <tr>   
  23.     <td> </td>   
  24.     <td><input type="submit" value="进入聊天室" /> <input type="reset" value="取消"></td>   
  25.   </tr>   
  26. </table>   
  27. </form>   
  28. <p align="center">河北软件职业技术学院CSDN学院PHP方向 版权所有 copyright 2011</p>   
  29. </body>   
  30. </html>   

聊天室首页:

Code:
  1. <?php   
  2. session_start();   
  3. if(!isset($_SESSION['user']))   
  4. {   
  5. $_SESSION['user']=$_POST['username'];   
  6. }   
  7.   
  8.  ?>   
  9. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  10. <html xmlns="http://www.w3.org/1999/xhtml">   
  11. <head>   
  12. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />   
  13. <title>欢迎使用AJAX聊天室</title>   
  14. <style>   
  15. .content{   
  16. height:300px;   
  17. width:616px;   
  18. font-size:14px;   
  19. color:#666666;   
  20. overflow:scroll;   
  21. background-color:#FFFF99;   
  22.   
  23. }   
  24. .sendtext{   
  25. color: #009900;   
  26. background-color:#CCFFCC;   
  27. font-size:14px;   
  28. }   
  29. .users{   
  30. width:170px;   
  31. }   
  32. .send{   
  33. width:60px;   
  34. height:50px;   
  35. color:#0033CC;}   
  36. </style>   
  37. </head>   
  38.   
  39. <body>   
  40. <table width="800" height="360" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#993399">   
  41.   <tr>   
  42.     <th width="616" height="31" bgcolor="#FFFFFF" scope="col">欢迎, <?php echo $_SESSION['user']; ?> 进入聊天室   
  43.     <input type="hidden" id="user" value="<?php echo $_SESSION['user']; ?>" /></th>   
  44.     <th width="184" rowspan="3" valign="middle" bgcolor="#FFFFFF" scope="col"><select id="userlist" class="users" size="27"><option>所有人</option></select></th>   
  45.   </tr>   
  46.   <tr>   
  47.     <td bgcolor="#FFFFFF"><div id="content" class="content"></div></td>   
  48.   </tr>   
  49.   <tr>   
  50.     <td bgcolor="#FFFFFF"><table width="800%" border="0" cellspacing="0" cellpadding="0">   
  51.       <tr>    
  52.         <td width="15%" align="right"><strong>我说:</strong></td>   
  53.         <td width="60%"><textarea id="sendtext" class="sendtext" cols="60" rows="3" οnkeypress="send1()"></textarea></td>   
  54.         <td width="25%" align="center"><input type="button" class="send" value="发送" οnclick="sengMsg()" /></td>   
  55.       </tr>   
  56.     </table></td>   
  57.   </tr>   
  58. </table>   
  59. <p align="center">河北软件职业技术学院CSDN学院PHP方向版权所有 copyright 2011<br>聊天室采用ajax+json技术实现</p>   
  60. </body>   
  61. </html>   
  62. <script language="javascript" type="text/javascript" src="firefoxEvent.js"></script>   
  63. <script language="javascript" type="text/javascript" src="../include/ajax.js"></script>   
  64. <script language="javascript" type="text/javascript">   
  65. /*  
  66. 将用户输入的信息保存到数据库  
  67. */  
  68.   function sengMsg(){   
  69.       
  70.     //定义对象   
  71.     var xhr=new XMLHttpRequest();   
  72.     //接受用户输入的内容   
  73.     var msg=$("sendtext").value;   
  74.        
  75.     //获取当前用户名   
  76.     var user=$("user").value;   
  77.     //定义请求的URL   
  78.     var url=$$("./sendMsg.php?msg="+msg+"&user="+user+"&r="+Math.random());   
  79.     //打开请求   
  80.     xhr.open("get",url,true);   
  81.        
  82.     xhr.send(null);   
  83.        
  84.     $("sendtext").value="";   
  85.   }   
  86.      
  87.   
  88.      
  89.   /*  
  90.   动态的查询数据库,两秒查询一次  
  91.   */  
  92.   var maxid=0;   
  93.      
  94.   function getMsg(){   
  95.      //获取当前用户名   
  96.      var user=$("user").value;   
  97.         
  98.      var url="./getMsg.php";   
  99.      var params="maxid="+maxid+"&user="+user;   
  100.         
  101.      ajaxget(url,params,getMsgProcess);   
  102.       
  103.   }   
  104.      
  105.   function getMsgProcess(xhr){   
  106.      
  107.       var msgObj=eval("("+xhr.responseText+")");   
  108.       var msg=msgObj.Msgs;   
  109.          
  110.       var msgstr=$("content").innerHTML;   
  111.       for(var i=0;i<msg.length;i++){   
  112.           
  113.         msgstr+="  <b>"+msg[i].spkname+"</b> ["+msg[i].theip+"]"+" "+msg[i].createTime+" 说:<br>"+"    <font color='blue'>"+msg[i].content+"</font><br>";   
  114.            
  115.         maxid=msg[i].id;   
  116.            
  117.          
  118.       }   
  119.       //   
  120.          
  121.       $("content").innerHTML=msgstr;   
  122.       //设置让滚动条跟随文字滚动   
  123.       $("content").scrollTop=$("content").scrollHeight;   
  124.   }   
  125.      
  126.  setInterval("getMsg()",2000);   
  127.  /*  
  128.  捕捉文本框按下或者按住事件  
  129.  */  
  130.  function send1(){   
  131.    //重写event事件   
  132.    var event = arguments[0]||window.event;   
  133.    //获得当前的ASC码   
  134.    var curKey = event.charCode||event.keyCode;   
  135.    //判断是否等于13,如如果是13则发送信息    
  136.    if(curKey==13){   
  137.    //调用发送方法   
  138.       sengMsg();   
  139.       
  140.    }   
  141.     
  142.  }   
  143.     
  144.  //****************************处理在线用户信息************************   
  145.     
  146.  function getUsers(){   
  147.      //获取当前用户名   
  148.      var user=$("user").value;   
  149.         
  150.      var url="./getUsers.php";   
  151.      var params="aa=1";   
  152.         
  153.      ajaxget(url,params,getUsersProcess);   
  154.       
  155.   }   
  156.      
  157.   function getUsersProcess(xhr){   
  158.      
  159.       var userlist=eval("("+xhr.responseText+")");   
  160.                        //重新设置在线用户下拉菜单的长度   
  161.       $("userlist").length=1;   
  162.          
  163.       for(var i=0;i<userlist.length;i++){   
  164.       //产生一个选项   
  165.         var opt=new Option(userlist[i].username,userlist[i].username);   
  166.                        //添加选项   
  167.         $("userlist").add(opt,null);   
  168.       }   
  169.         
  170.   }   
  171.      
  172.  setInterval("getUsers()",2000);   
  173.     
  174.      
  175. </script>   
  176.   

Ajax异步发送聊天信息页面:
 

Code:
  1. <?php   
  2. //连接数据库   
  3. include("../include/dbconn.php");   
  4. //定义sql   
  5. $sql="insert into chat(spkname,theip,content,createTime)   
  6.                  values('{$_GET['user']}','{$_SERVER['REMOTE_ADDR']}','{$_GET['msg']}',now())";   
  7. //执行插入语句   
  8. mysql_query($sql);   
  9.  ?>   

Ajax异步读取数据服务端:

Code:
  1. <?php   
  2. //连接数据库   
  3. include("../include/dbconn.php");   
  4.   
  5. /*  
  6. 1) 判断一下当前用户是否已经在,useronline中存在,如果存在我们直接更新的他的名称、最后活跃时间  
  7. 2)如果不存在,我们直接添加一条在线信息  
  8.  
  9. 3)判断是否离线,取出最后的时间和当前得时间的时间差,如果是大于设定的时间,表明已经离线,  
  10. 则我们要删除离线用户的信息  
  11.  
  12. */  
  13. $rs=mysql_query("select id from useronline where theip ='{$_SERVER['REMOTE_ADDR']}'");   
  14. //判断   
  15. if(mysql_num_rows($rs)){   
  16.   //查询到,直接更新数据   
  17.   mysql_query("update useronline set username='{$_GET['user']}',lastTime=now() where theip ='{$_SERVER['REMOTE_ADDR']}'");   
  18.   
  19. }else{   
  20.   mysql_query(" insert into useronline(username,theip,lastTime) values('{$_GET['user']}','{$_SERVER['REMOTE_ADDR']}',now())");   
  21. }   
  22. //删除不在线   
  23. mysql_query("delete from useronline where TIME_TO_SEC(now())-TIME_TO_SEC(lastTime)>10");   
  24.   
  25.   
  26.   
  27. //定义sql   
  28. $sql="select id,spkname,theip,content,createTime from chat where id>{$_GET['maxid']}";   
  29. //执行插入语句   
  30. $rs=mysql_query($sql);   
  31.   
  32. $arr=array();   
  33. while($row=mysql_fetch_assoc($rs)){   
  34.      
  35.     $arr[]=$row;   
  36.   
  37. }   
  38. $arr2=array("Msgs"=>$arr);   
  39. echo json_encode($arr2);   
  40.  ?>   

得到当前在线用户列表:

Code:
  1. <?php   
  2. //连接数据库   
  3. include("../include/dbconn.php");   
  4. $sql="select username,theip from useronline";   
  5. $rs=mysql_query($sql);   
  6.   
  7. while($row=mysql_fetch_assoc($rs)){   
  8.    $arr[]=$row;   
  9. }   
  10.   
  11. echo json_encode($arr);   
  12. //{{},{},}   
  13. ?>  

以上文件为完整代码,部分包含文件没有贴出,但是能够在我前几篇帖子中找到。敬请查看。

[原创]超级经典聊天室系统实现 Ajax+PHP+Javascrcript+Json无刷新技术倾力打造(一)

  [原创地址]    [源码下载]    [更多原创,多多支持多]

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值