[原创]超级经典聊天室系统实现 Ajax+PHP+Javascrcript+Json无刷新技术倾力打造(二)
2011-03-15 10:39
761 查看
接上文,我们提出了实现聊天室必须要解决的问题,下面我们来一起探讨下,这些问题将如何解决。
1)关于数据存储的问题。 数据存储可以采用多种形式,如:xml、写入文件,在其他语言中还是可以用application这个全局变量,而在PHP中没有这个全局变量,需要自己封装,还用使用数据库存储数据。本人比较懒惰,呵呵,使用数据库技术实现对数据的存储,这样即有利于数据的永久保存,更方便我们书写代码。
2)数据显示的问题。数据显示的问题也可以通过多种方法来实现,比如:可以定时让网页刷新,每次刷新从数据库中读取数据,但是这种方法的最大问题是,每次可能会从数据库中取出所有的聊天信息,这样效率太差了。如果同时有几百个人同时在线,那么这个聊天室就会很慢很卡了,还有一种技术是采用Ajax技术实现局部刷新技术,动态的读取所需要的数据,这里应该说明一点要,实现聊天室一定要考虑性能、效率问题,所以读取数局决不能读取所有数据,而是要每次读取最后一条或者几条最新的数据...
我的这个聊天室已经实现这部分,请大家继续往下看。
3)判断用户何时在线,何时离线。我们的在线用户列表中显示的是在线的用户,那何时判断用户在线情况的呢,我们这里是这样处理的,首先当用户进入聊天室的时候,需要初始化聊天室信息,以后每隔一段时间读取一次数据库,而我正是利用这点每次把用户的IP插入和当前时间插入到数据库中,当然,当当前用户IP已经存在当前表中,则我直接更新用户的最后一次登录时间,所以当用户没有离开这个页面,我都认为是在线。否则的情况是离线,离线的时候应该从用户在线表中删除当前用户的信息,最后把所有的用户显示到在线列表中。
4)聊天室的一些特殊的处理。这里特殊处理包括当文字内容特别多的时候,会出现滚动条,让滚动条跟随内容滚动到底部,处理一些快捷键,直接可以发送信息等。
下面直接看源码:
聊天室登录页面
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>欢迎使用AJAX聊天室</title>
</head>
<body>
<form action="chatindex.php" name="form1" method="post">
<table width="400" border="1" align="center">
<tr>
<th height="52" colspan="2" scope="col">欢迎使用AJAX聊天室</th>
</tr>
<tr>
<td width="107">用户名:</td>
<td width="277"><input type="text" name="username" /></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" value="进入聊天室" /> <input type="reset" value="取消"></td>
</tr>
</table>
</form>
<p align="center">河北软件职业技术学院CSDN学院PHP方向 版权所有 copyright 2011</p>
</body>
</html>
聊天室首页:
Code:
<?php
session_start();
if(!isset($_SESSION['user']))
{
$_SESSION['user']=$_POST['username'];
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>欢迎使用AJAX聊天室</title>
<style>
.content{
height:300px;
width:616px;
font-size:14px;
color:#666666;
overflow:scroll;
background-color:#FFFF99;
}
.sendtext{
color: #009900;
background-color:#CCFFCC;
font-size:14px;
}
.users{
width:170px;
}
.send{
width:60px;
height:50px;
color:#0033CC;}
</style>
</head>
<body>
<table width="800" height="360" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#993399">
<tr>
<th width="616" height="31" bgcolor="#FFFFFF" scope="col">欢迎, <?php echo $_SESSION['user']; ?> 进入聊天室
<input type="hidden" id="user" value="<?php echo $_SESSION['user']; ?>" /></th>
<th width="184" rowspan="3" valign="middle" bgcolor="#FFFFFF" scope="col"><select id="userlist" class="users" size="27"><option>所有人</option></select></th>
</tr>
<tr>
<td bgcolor="#FFFFFF"><div id="content" class="content"></div></td>
</tr>
<tr>
<td bgcolor="#FFFFFF"><table width="800%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="15%" align="right"><strong>我说:</strong></td>
<td width="60%"><textarea id="sendtext" class="sendtext" cols="60" rows="3" onkeypress="send1()"></textarea></td>
<td width="25%" align="center"><input type="button" class="send" value="发送" onclick="sengMsg()" /></td>
</tr>
</table></td>
</tr>
</table>
<p align="center">河北软件职业技术学院CSDN学院PHP方向版权所有 copyright 2011<br>聊天室采用ajax+json技术实现</p>
</body>
</html>
<script language="javascript" type="text/javascript" src="firefoxEvent.js"></script>
<script language="javascript" type="text/javascript" src="../include/ajax.js"></script>
<script language="javascript" type="text/javascript">
/*
将用户输入的信息保存到数据库
*/
function sengMsg(){
//定义对象
var xhr=new XMLHttpRequest();
//接受用户输入的内容
var msg=$("sendtext").value;
//获取当前用户名
var user=$("user").value;
//定义请求的URL
var url=$$("./sendMsg.php?msg="+msg+"&user="+user+"&r="+Math.random());
//打开请求
xhr.open("get",url,true);
xhr.send(null);
$("sendtext").value="";
}
/*
动态的查询数据库,两秒查询一次
*/
var maxid=0;
function getMsg(){
//获取当前用户名
var user=$("user").value;
var url="./getMsg.php";
var params="maxid="+maxid+"&user="+user;
ajaxget(url,params,getMsgProcess);
}
function getMsgProcess(xhr){
var msgObj=eval("("+xhr.responseText+")");
var msg=msgObj.Msgs;
var msgstr=$("content").innerHTML;
for(var i=0;i<msg.length;i++){
msgstr+=" <b>"+msg[i].spkname+"</b> ["+msg[i].theip+"]"+" "+msg[i].createTime+" 说:<br>"+" <font color='blue'>"+msg[i].content+"</font><br>";
maxid=msg[i].id;
}
//
$("content").innerHTML=msgstr;
//设置让滚动条跟随文字滚动
$("content").scrollTop=$("content").scrollHeight;
}
setInterval("getMsg()",2000);
/*
捕捉文本框按下或者按住事件
*/
function send1(){
//重写event事件
var event = arguments[0]||window.event;
//获得当前的ASC码
var curKey = event.charCode||event.keyCode;
//判断是否等于13,如如果是13则发送信息
if(curKey==13){
//调用发送方法
sengMsg();
}
}
//****************************处理在线用户信息************************
function getUsers(){
//获取当前用户名
var user=$("user").value;
var url="./getUsers.php";
var params="aa=1";
ajaxget(url,params,getUsersProcess);
}
function getUsersProcess(xhr){
var userlist=eval("("+xhr.responseText+")");
//重新设置在线用户下拉菜单的长度
$("userlist").length=1;
for(var i=0;i<userlist.length;i++){
//产生一个选项
var opt=new Option(userlist[i].username,userlist[i].username);
//添加选项
$("userlist").add(opt,null);
}
}
setInterval("getUsers()",2000);
</script>
Ajax异步发送聊天信息页面:
Code:
<?php
//连接数据库
include("../include/dbconn.php");
//定义sql
$sql="insert into chat(spkname,theip,content,createTime)
values('{$_GET['user']}','{$_SERVER['REMOTE_ADDR']}','{$_GET['msg']}',now())";
//执行插入语句
mysql_query($sql);
?>
Ajax异步读取数据服务端:
Code:
<?php
//连接数据库
include("../include/dbconn.php");
/*
1) 判断一下当前用户是否已经在,useronline中存在,如果存在我们直接更新的他的名称、最后活跃时间
2)如果不存在,我们直接添加一条在线信息
3)判断是否离线,取出最后的时间和当前得时间的时间差,如果是大于设定的时间,表明已经离线,
则我们要删除离线用户的信息
*/
$rs=mysql_query("select id from useronline where theip ='{$_SERVER['REMOTE_ADDR']}'");
//判断
if(mysql_num_rows($rs)){
//查询到,直接更新数据
mysql_query("update useronline set username='{$_GET['user']}',lastTime=now() where theip ='{$_SERVER['REMOTE_ADDR']}'");
}else{
mysql_query(" insert into useronline(username,theip,lastTime) values('{$_GET['user']}','{$_SERVER['REMOTE_ADDR']}',now())");
}
//删除不在线
mysql_query("delete from useronline where TIME_TO_SEC(now())-TIME_TO_SEC(lastTime)>10");
//定义sql
$sql="select id,spkname,theip,content,createTime from chat where id>{$_GET['maxid']}";
//执行插入语句
$rs=mysql_query($sql);
$arr=array();
while($row=mysql_fetch_assoc($rs)){
$arr[]=$row;
}
$arr2=array("Msgs"=>$arr);
echo json_encode($arr2);
?>
得到当前在线用户列表:
Code:
<?php
//连接数据库
include("../include/dbconn.php");
$sql="select username,theip from useronline";
$rs=mysql_query($sql);
while($row=mysql_fetch_assoc($rs)){
$arr[]=$row;
}
echo json_encode($arr);
//{{},{},}
?>
以上文件为完整代码,部分包含文件没有贴出,但是能够在我前几篇帖子中找到。敬请查看。
1)关于数据存储的问题。 数据存储可以采用多种形式,如:xml、写入文件,在其他语言中还是可以用application这个全局变量,而在PHP中没有这个全局变量,需要自己封装,还用使用数据库存储数据。本人比较懒惰,呵呵,使用数据库技术实现对数据的存储,这样即有利于数据的永久保存,更方便我们书写代码。
2)数据显示的问题。数据显示的问题也可以通过多种方法来实现,比如:可以定时让网页刷新,每次刷新从数据库中读取数据,但是这种方法的最大问题是,每次可能会从数据库中取出所有的聊天信息,这样效率太差了。如果同时有几百个人同时在线,那么这个聊天室就会很慢很卡了,还有一种技术是采用Ajax技术实现局部刷新技术,动态的读取所需要的数据,这里应该说明一点要,实现聊天室一定要考虑性能、效率问题,所以读取数局决不能读取所有数据,而是要每次读取最后一条或者几条最新的数据...
我的这个聊天室已经实现这部分,请大家继续往下看。
3)判断用户何时在线,何时离线。我们的在线用户列表中显示的是在线的用户,那何时判断用户在线情况的呢,我们这里是这样处理的,首先当用户进入聊天室的时候,需要初始化聊天室信息,以后每隔一段时间读取一次数据库,而我正是利用这点每次把用户的IP插入和当前时间插入到数据库中,当然,当当前用户IP已经存在当前表中,则我直接更新用户的最后一次登录时间,所以当用户没有离开这个页面,我都认为是在线。否则的情况是离线,离线的时候应该从用户在线表中删除当前用户的信息,最后把所有的用户显示到在线列表中。
4)聊天室的一些特殊的处理。这里特殊处理包括当文字内容特别多的时候,会出现滚动条,让滚动条跟随内容滚动到底部,处理一些快捷键,直接可以发送信息等。
下面直接看源码:
聊天室登录页面
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>欢迎使用AJAX聊天室</title>
</head>
<body>
<form action="chatindex.php" name="form1" method="post">
<table width="400" border="1" align="center">
<tr>
<th height="52" colspan="2" scope="col">欢迎使用AJAX聊天室</th>
</tr>
<tr>
<td width="107">用户名:</td>
<td width="277"><input type="text" name="username" /></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" value="进入聊天室" /> <input type="reset" value="取消"></td>
</tr>
</table>
</form>
<p align="center">河北软件职业技术学院CSDN学院PHP方向 版权所有 copyright 2011</p>
</body>
</html>
聊天室首页:
Code:
<?php
session_start();
if(!isset($_SESSION['user']))
{
$_SESSION['user']=$_POST['username'];
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>欢迎使用AJAX聊天室</title>
<style>
.content{
height:300px;
width:616px;
font-size:14px;
color:#666666;
overflow:scroll;
background-color:#FFFF99;
}
.sendtext{
color: #009900;
background-color:#CCFFCC;
font-size:14px;
}
.users{
width:170px;
}
.send{
width:60px;
height:50px;
color:#0033CC;}
</style>
</head>
<body>
<table width="800" height="360" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#993399">
<tr>
<th width="616" height="31" bgcolor="#FFFFFF" scope="col">欢迎, <?php echo $_SESSION['user']; ?> 进入聊天室
<input type="hidden" id="user" value="<?php echo $_SESSION['user']; ?>" /></th>
<th width="184" rowspan="3" valign="middle" bgcolor="#FFFFFF" scope="col"><select id="userlist" class="users" size="27"><option>所有人</option></select></th>
</tr>
<tr>
<td bgcolor="#FFFFFF"><div id="content" class="content"></div></td>
</tr>
<tr>
<td bgcolor="#FFFFFF"><table width="800%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="15%" align="right"><strong>我说:</strong></td>
<td width="60%"><textarea id="sendtext" class="sendtext" cols="60" rows="3" onkeypress="send1()"></textarea></td>
<td width="25%" align="center"><input type="button" class="send" value="发送" onclick="sengMsg()" /></td>
</tr>
</table></td>
</tr>
</table>
<p align="center">河北软件职业技术学院CSDN学院PHP方向版权所有 copyright 2011<br>聊天室采用ajax+json技术实现</p>
</body>
</html>
<script language="javascript" type="text/javascript" src="firefoxEvent.js"></script>
<script language="javascript" type="text/javascript" src="../include/ajax.js"></script>
<script language="javascript" type="text/javascript">
/*
将用户输入的信息保存到数据库
*/
function sengMsg(){
//定义对象
var xhr=new XMLHttpRequest();
//接受用户输入的内容
var msg=$("sendtext").value;
//获取当前用户名
var user=$("user").value;
//定义请求的URL
var url=$$("./sendMsg.php?msg="+msg+"&user="+user+"&r="+Math.random());
//打开请求
xhr.open("get",url,true);
xhr.send(null);
$("sendtext").value="";
}
/*
动态的查询数据库,两秒查询一次
*/
var maxid=0;
function getMsg(){
//获取当前用户名
var user=$("user").value;
var url="./getMsg.php";
var params="maxid="+maxid+"&user="+user;
ajaxget(url,params,getMsgProcess);
}
function getMsgProcess(xhr){
var msgObj=eval("("+xhr.responseText+")");
var msg=msgObj.Msgs;
var msgstr=$("content").innerHTML;
for(var i=0;i<msg.length;i++){
msgstr+=" <b>"+msg[i].spkname+"</b> ["+msg[i].theip+"]"+" "+msg[i].createTime+" 说:<br>"+" <font color='blue'>"+msg[i].content+"</font><br>";
maxid=msg[i].id;
}
//
$("content").innerHTML=msgstr;
//设置让滚动条跟随文字滚动
$("content").scrollTop=$("content").scrollHeight;
}
setInterval("getMsg()",2000);
/*
捕捉文本框按下或者按住事件
*/
function send1(){
//重写event事件
var event = arguments[0]||window.event;
//获得当前的ASC码
var curKey = event.charCode||event.keyCode;
//判断是否等于13,如如果是13则发送信息
if(curKey==13){
//调用发送方法
sengMsg();
}
}
//****************************处理在线用户信息************************
function getUsers(){
//获取当前用户名
var user=$("user").value;
var url="./getUsers.php";
var params="aa=1";
ajaxget(url,params,getUsersProcess);
}
function getUsersProcess(xhr){
var userlist=eval("("+xhr.responseText+")");
//重新设置在线用户下拉菜单的长度
$("userlist").length=1;
for(var i=0;i<userlist.length;i++){
//产生一个选项
var opt=new Option(userlist[i].username,userlist[i].username);
//添加选项
$("userlist").add(opt,null);
}
}
setInterval("getUsers()",2000);
</script>
Ajax异步发送聊天信息页面:
Code:
<?php
//连接数据库
include("../include/dbconn.php");
//定义sql
$sql="insert into chat(spkname,theip,content,createTime)
values('{$_GET['user']}','{$_SERVER['REMOTE_ADDR']}','{$_GET['msg']}',now())";
//执行插入语句
mysql_query($sql);
?>
Ajax异步读取数据服务端:
Code:
<?php
//连接数据库
include("../include/dbconn.php");
/*
1) 判断一下当前用户是否已经在,useronline中存在,如果存在我们直接更新的他的名称、最后活跃时间
2)如果不存在,我们直接添加一条在线信息
3)判断是否离线,取出最后的时间和当前得时间的时间差,如果是大于设定的时间,表明已经离线,
则我们要删除离线用户的信息
*/
$rs=mysql_query("select id from useronline where theip ='{$_SERVER['REMOTE_ADDR']}'");
//判断
if(mysql_num_rows($rs)){
//查询到,直接更新数据
mysql_query("update useronline set username='{$_GET['user']}',lastTime=now() where theip ='{$_SERVER['REMOTE_ADDR']}'");
}else{
mysql_query(" insert into useronline(username,theip,lastTime) values('{$_GET['user']}','{$_SERVER['REMOTE_ADDR']}',now())");
}
//删除不在线
mysql_query("delete from useronline where TIME_TO_SEC(now())-TIME_TO_SEC(lastTime)>10");
//定义sql
$sql="select id,spkname,theip,content,createTime from chat where id>{$_GET['maxid']}";
//执行插入语句
$rs=mysql_query($sql);
$arr=array();
while($row=mysql_fetch_assoc($rs)){
$arr[]=$row;
}
$arr2=array("Msgs"=>$arr);
echo json_encode($arr2);
?>
得到当前在线用户列表:
Code:
<?php
//连接数据库
include("../include/dbconn.php");
$sql="select username,theip from useronline";
$rs=mysql_query($sql);
while($row=mysql_fetch_assoc($rs)){
$arr[]=$row;
}
echo json_encode($arr);
//{{},{},}
?>
以上文件为完整代码,部分包含文件没有贴出,但是能够在我前几篇帖子中找到。敬请查看。
[原创]超级经典聊天室系统实现 Ajax+PHP+Javascrcript+Json无刷新技术倾力打造(一)
[原创地址] [源码下载] [更多原创,多多支持多]相关文章推荐
- [原创]超级经典聊天室系统实现 Ajax+PHP+Javascrcript+Json无刷新技术倾力打造(一)
- 【2012年最新原创AJAX案例,重磅推出】1、使用ajax+js+json+dom+php+mysql实现超强 Web聊天室V2.0
- php+ajax+json实现静态刷新页面
- ajax+js+json+dom+php+mysql实现一个聊天室
- Ajax PHP JavaScript MySQL实现简易的无刷新在线聊天室
- Ajax PHP JavaScript MySQL实现简易的无刷新在线聊天室
- [原创]终极分页:Ajax+Js+Dom+Json无刷新分页技术叫板另一篇仿百度、Google分页算法
- Jquery中的AJax技术结合PHP实现无刷新验证验证码
- 利用ajax实现与php(json数组)数据交互,并局部刷新页面
- ajax+php+mysql实现无刷新点赞功能
- .net用ajax技术实现无刷新分页(初学)
- AJAX聊天室无刷新技术方案
- 落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
- 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍
- php学习笔记(三十)ajax请求和接收参数的实现方式(包括json数据格式的简单处理)
- 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍
- 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍
- Ajax+Js+Dom+Json无刷新分页技术
- PHP-Ajax实现无刷新分页
- 实现一个无刷新的基于ajax的简易聊天室