首页 后端开发 php教程 基于PHP的聊天室编程思想_PHP

基于PHP的聊天室编程思想_PHP

Jun 01, 2016 pm 12:32 PM
基于 思想 显示 更新 程序 编程 聊天室

1 页面登陆的基本要素
你可以在我的竹叶看到登陆 的表单,这里提供了最基本的登陆表单项
(1)登陆表单


(a)聊天表单的名字为chatform,我使用action=enter作为进入聊天室的入口,如果没有这个参数,则显示登陆页 面.
(b)在表单提交时,先调用b1_submit()建立聊天的窗口
(c)聊天的目标窗口为b1_submit()建立 的howtodo窗口

(2)表单项
昵称:
密码:


(a)各表单项一定要设定最大允许长度 maxlength

(3)建立聊天窗口的js
language="javascript" type="text/javascript">
function b1_submit(){
chat=window.open('',"howtodo",'Status=no,scrollbars=no,resizable=no');
chat.moveTo(0,0);
chat.resizeTo(screen.availWidth,screen.availHeight);
chat.outerWidth=screen.availWidth;
chat.outerHeight=screen.availHeight;
}
这段代码先 打开一个没有状态栏,滚动条,可调整尺寸的howtodo窗口!然后移动到屏幕左上角,然后放大到允许的屏幕大小.

聊天室编程思想--大门 -- 通行证

大门 -- 通行证
聊天室可以采用完全自由的方式运行,你可以随意 输入呢称,不用密码,不保存你的聊天状态,优点是:自由,非常适合于游客!另外一个方法是注册聊天室,每个进入 聊天室的人都要输入自己的用户名和密码才能进入!优点:充分体现个性,非常适合于老朋友,他们的呢称不会被 人恶意侵占使用.我的聊天室使用注册方法!

注册通常采用2种方法:1,先注册然后进入聊天;2,自动注 册,然后在里面修改自己的资料!我采用第2种方法!!每个新进入的聊友的用户名会被自动保存到注册到数据库内 ,下次登陆必须输入准确的密码才能进入!

下面是判断部分!本程序使用文本数据库 !

//$useronline为在线人的数据文件名称
//$useronlinelock为在线人的锁定标志
//$register为已经注册的数据文件名称
//$registerlock为注册文件的锁定标志
//$split为分隔 符

//登陆参数 enter
if($action == "enter")
{
//当前时间秒数
$timecurrent = date("U");

//锁定在线人数文件,防止同时修改同一个文件
while( file_exists($useronlinelock))
{
if(!file_exists($useronlinelock))
{
break;
}
}

//创建临时文件
fclose(fopen($useronlinelock,"w"));

//读入在线用户和已经注册用户的信息:密码,昵称,更新时间
$useronline = file($useronline);
$register = file($register);

//用于判断登 陆是否成功的标志
$namesign=0;

//判断用户名,密码的错误,用户名不允许为空,不允许超过10 个字符,密码不允许超过20个字符
if(($name =="") || (strlen($name) > 10) || (strlen($pass) > 20) )
{
print("没有昵称或密码过长");
//登陆失败
$namesign=1;
//删除临时文件
unlink($useronlinelock);
}
else
{
//查找是否已经有人注册或者密码错误
$foundsign=0;
for($i=0;$i{
//分割
$tempregister = split($split,$register[$i],99);
//找到已经注册的用户名
if( $name == $tempregister[0] )
{
//已经找到标志
$foundsign=1;
//密码正确吗
if($pass != $tempregister[1])
print("密码错了!");
//登陆失败
$namesign=1;
unlink($useronlinelock);
break;
}
else
{
//老用户登陆成功
$namesign=0;
break;
}
}

}

//如果没有找到这个用户名,那么就自动注册
if(!$foundsign)
{
//保存用户名和密码
$handle = fopen($register,"a");
fputs($handle,"$name$split$pass$split ");
fclose($handle);
//新 用户登陆成功
$namesign=0;
}
}
}
if(!$namesign)
{
//更新在线人的名单
$useronlinehandle = fopen($useronline,"w");

//判断是否已经在里面,只是刷新页面
$updatesign = 0;
for($i=0;$i{
$usertemp=split($split,chop($useronline[$i]),99);
if($name == $usertemp[0])
{
//更新标志
$updatesign = 1;
fputs($useronlinehandle,$useronline[$i]);
}
else
{
fputs($useronlinehandle,$useronline[$i]);
}
}
//如 果没有在里面,则增加到里面
if(!$updatesign)
fputs($useronlinehandle,"$name$split$level$split$pass$split$timecurrent ");
fclose($useronlinehandle);

//去掉缩定
unlink($useronlinelock);

//登陆成 功
}

到这里,用户的验证已经完成,聊友已经合法的进入了聊天室,携带者呢称和密码


聊天室编程思想--大厅 -- 显示界面


大厅 -- 显示界面
2000年09月04
现在的www聊天室基本全部采用框架方式,可以用 frame也可以用iframe看个人喜欢了,我的采用frame的传统方式

print(" ");
print(" ");

//主显示屏幕,负责显示聊天内容
print(" ");

//在线人数屏幕
print("");
print(" ");

//发送信息的屏幕,信息指挥中心,所有指令都要由这里发出
print(" ");

//被动更新屏幕,处理发送的信息
print(" ");

/主动更新屏幕,显示自己和其他聊友的聊天信息
print(" ");

//检测是否在线的屏幕,对于异常 离开,如死机,掉线等的处理
print(" ");
print(" ");

因为各个页面之间的程序有 联系,所以显示顺序很重要,可以看到,我这里只有发送页面不是about:blank,其他页面的显示都要先通过发送页 面的调用才能开始.


聊天室编程思想--大厅 -- 在线人数

大厅 -- 在线人数

我根据网易聊天室的在线人数的方法,显示当前的在 线人数,代码解释如下:

1 登陆时建立在线人名单的数组,放在body后面


//锁定在线 人数文件
while(file_exists($useronlinelock)){$pppp++;}
fclose(fopen($useronlinelock,"w"));

//读入在线人名单
$useronline = file($useronline);
unlink($useronlinelock);

//建立数组 list
print("document.writeln("list=new Array(");
$k=count($useronline);
if($k>1)
{
for($i=0;$i{
$usercurrent = split($split,$useronline[$i],99);
// 姓名+,
print("'$usercurrent[0]',");
}
$i=$k-1;
// 处理最后一个姓名
$usercurrent = split($split,$useronline[$i],99);
print("'$usercurrent[0]'");
}
// 数组结束
print(")"); ");
?>

2显示在 线人数的js
document.writeln('[在线人数'+count+']
');
document.writeln("[所有人]
");
document.writeln("");
var j,name,club;
for(var i=0;i {
if(list[i]!=null){

//显示每个在线人的名字
document.writeln(""+list[i]+"
");
}
}
this.r.document.writeln('

');


3改变聊天对象
function cs(name)
{
if(this.d.document==null)return;
if(name=='所有人')
{
this.d.add('所有人');
this.d.document.inputform.talkto.value='所有人 ';

//改变焦点
this.d.document.inputform.msg.focus();
return;
}
for(var i=0;i {
if(list[i]==name)
{

//更改发送的谈话对象
this.d.document.inputform.talkto.value=list[i];
this.d.document.inputform.msg.focus();
return;
}
}

//错误
alert('此用户已离线或已改了昵称。');
}

4删除一个用户
function del(str)
{
for(var i=0;i if(list[i]==str)
{
delete list[i];
count--;
}
}


5增加一个用户
function add(str1,str2)
{
var l=list.length;
for(var i=0;i
//如果已经在数组里面则返回
if(list[i]==str1)
return;

//增加一个用户
list[l]=str1;
count++;
}

6更新聊天人数的方法,定时器的使用
var timerID=null;
var timerRunning=false;

function stop()
{
//停止
if(timerRunning)clearTimeout(timerID);
timerRunning=false;
}
function start()
{
stop();
//调用更新在线人数的程序
write1();
}

function write1()
{
... ... ... ...
//设定更新时间,
timerID=setTimeout("start()",30000);
timerRunning=true;
}


这种方法比较简单的实现了在线人数的显示,当然也可以使用读入在线 人文件的方法显示在线人数,不过在改变聊天对象是会比较麻烦.


聊天室编程思想--指挥中心 -- 发送信息

指挥中心 -- 发送信息
这里是聊天室的指挥中心,所有的指令都要在这里发出

1下面是基本的发送表单代码




//下面的2个参数用于验证信息的正确性
print(" ");
print(" ");
?>

//聊天对象,注意加上 readonly 属性


//上次聊天的发送内容


//发送的表单文本框






2 检查发送内容的js

var dx ='';
function checksay( )
{

//不允许发送空的发言
if(document.inputform.msg.value=='')
{
document.inputform.msg.focus();
return false;
}

//不允许重复发言,内容相同,对象相同
if ((document.inputform.msg.value==document.inputform.message.value)&&(document.inputform.talkto.value==dx))
{
alert('发言不能重复');
document.inputform.msg.focus();
return false;
}

//两次发言内容的间隔不能小于1秒,或者发言字数大于间隔*3
t2=(new Date()).getTime()/1000;
if(((t2-t1){
document.inputform.msg.focus();
return false;
}

//更新时间
t1=t2;

document.inputform.showsign.value=1;

//保存上次发言内容
document.inputform.message.value =document.inputform.msg.value;

//清空发言内容
document.inputform.msg.value ='';

//保存发言对象
dx=document.inputform.talkto.value;

//定位焦点
document.inputform.msg.focus();

//返回
return(true);
}

3调用信息发送程序,发布聊天者已经进入的信息
>
parent.bl.document.open();
parent.bl.document.write(" ")
parent.bl.document.close();


发言由messagesend.php处理完成,注意输出对象为bl,也就是处理发言的框架名称,这样保证发言框架的页面内容的完整


聊天室编程思想--主动更新与被动更新


主动更新与被动更新

聊天的内容如何显示在屏幕上,一种是每隔一段时间刷新一次页面,读入全部聊天内容,然后显示,这里采用的是js的document.write的方法实现不刷新的聊天页面!

1 主页面的生成,规定了CSS类型,显示欢迎词
function write2(){
if(this.u.document==null)return;
this.u.document.writeln("");
this.u.document.writeln("");
this.u.document.writeln(" ");

this.u.document.writeln("");
this.u.document.writeln("//.................. 这里插入生成在线人数组的程序段


this.u.document.writeln(" type="text/javascript">");
this.u.document.writeln("

");
this.u.document.writeln("

欢迎光临PlayBoy聊天室,本聊天室正在测试阶段,如有问题请与我们联系

");
}

2 初始化进入信息,第一次进入聊天室

if($action == "enter")
{

/////////////////// 调用显示主屏幕的js程序 ////////////////////
print("parent.write2(); ");

//发言内容,某某进入聊天室了
$message = "$name来到聊天室".$message." ".date("m月d日 H:i")." >parent.add('$name','$photo');parent.write1();
";
}
//更新发言内容
while(file_exists($lockfile)){ $pppp++; }

//发言的锁定
fclose(fopen($lockfile,"w"));

//读入发言的总句数,也就是所有人一共发了多少言!我们可以保存每一个发言,但是这样会占用大量的磁盘空间,我们采用了一种取模的方法,循环使用文件来减少文件操作!
$talkmessage = file($filename);
$number = chop($talkmessage[0]);

//发言数增加一,然后保存
$talkhandle = fopen($filename,"w");
$number++;
fputs($talkhandle,$number);
fclose($talkhandle);

/去掉锁定
unlink($lockfile);

//对发言总数对10取模,作为文件名保存发言内容,也就是说第11句和第1句使用同一个文件名,由于不可能同时有10句话没有更新,所以这是数在人不是非常多的情况下很好!当然,考虑到人多的情况,可以设成100.
$filehandle = fopen("messageonline".($number%10).".php","w");
fputs($filehandle,$message);
fclose($filehandle);

//显示进入信息
print("parent.u.document.writeln("$message"); ");

//调用主动刷新js程序,传递已经显示的发言数目
print("parent.flushwin($number) ");

//保存最后一次显示的发言
$last = $number;
}


3 处理发送表单的请求

//不处理空的发言和超过一定数目的发言
if( ($message != "")&&(strlen($message){

//检查发言者是否在线,防止意外
$onlineperson = file("useronline.dbf");
$personsign=0;
for($i=0;$i{
$person = split($split,$onlineperson[$i],99);
if($person[0] == $name)
{
$personsign = 1;
$person[3] = date("U");
break;
}
}

//在线时的处理程序
if($personsign == 1)
{

//添加发言时间的部分
$message = $message." ".date("m月d日 H:i")."
";

//锁定发言总数文件
while(file_exists($lockfile)){ $pppp++; }
fclose(fopen($lockfile,"w"));

//读入发言总数
$talkmessage = file($filename);
$number = chop($talkmessage[0]);

//总数加1,然后保存
$talkhandle = fopen($filename,"w");
$number++;
fputs($talkhandle,$number);
fclose($talkhandle);
unlink($lockfile);

//总数对10取模后以文件形式保存发言内容
$filehandle = fopen("messageonline".($number%10).".php","w");
fputs($filehandle,$message);
fclose($filehandle);
}
}

//////////////////////////////////////////////////////////////////
这样,表单的处理已经完成,下面的主动更新程序将会把新的发言内容显示在屏幕上
//////////////////////////////////////////////////////////////////

4 主动更新的自动循环调用方法

可以使用 &&pass=&&last="+winnumber;
flush.location=url
flushflag=false
}

//否则等待一个循环
flushtimerID=setTimeout("flushstart()",2000);
flushtimerRunning=true;
}

这种方法保证了在主程序不死的情况下,后台更新程序会一直运行下去!


5 主动更新程序
language="JavaScript" type="text/javascript">

//读入最大的发言数目
$message = file($filename);
$number = chop($message[0]);

//从上次显示的下一个发言开始到最大发言结束,显示发言内容
for($i=$last+1;$i{
//读入下一个发言内容
$filename = "messageonline".($i%10).".php";
$message = file($filename);
$tempmessage = split($split,$message[0],99);

//显示发言内容
print("parent.u.document.writeln("$message[0]"); ");
}

//更新发送表单最后一个发言的数目
print("parent.d.document.inputform.last.value=$number; ");

//通知主程序本次更新已经完成
print("parent.flushflag=true; ");
?>



这样,每个发送的发言,经过被动更新程序处理保存到文件内,然后由一个循环的主动更新程序完成显示任务!!!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

iPhone中缺少时钟应用程序:如何修复 iPhone中缺少时钟应用程序:如何修复 May 03, 2024 pm 09:19 PM

您的手机中缺少时钟应用程序吗?日期和时间仍将显示在iPhone的状态栏上。但是,如果没有时钟应用程序,您将无法使用世界时钟、秒表、闹钟等多项功能。因此,修复时钟应用程序的缺失应该是您的待办事项列表的首位。这些解决方案可以帮助您解决此问题。修复1–放置时钟应用程序如果您错误地从主屏幕中删除了时钟应用程序,您可以将时钟应用程序放回原位。步骤1–解锁iPhone并开始向左侧滑动,直到到达“应用程序库”页面。步骤2–接下来,在搜索框中搜索“时钟”。步骤3–当您在搜索结果中看到下方的“时钟”时,请按住它并

无法允许访问 iPhone 中的摄像头和麦克风 无法允许访问 iPhone 中的摄像头和麦克风 Apr 23, 2024 am 11:13 AM

您在尝试使用应用程序时是否收到“无法允许访问摄像头和麦克风”?通常,您可以在需要提供的基础上向特定对象授予摄像头和麦克风权限。但是,如果您拒绝权限,摄像头和麦克风将无法工作,而是显示此错误消息。解决这个问题是非常基本的,你可以在一两分钟内完成。修复1–提供相机、麦克风权限您可以直接在设置中提供必要的摄像头和麦克风权限。步骤1–转到“设置”选项卡。步骤2–打开“隐私与安全”面板。步骤3–在那里打开“相机”权限。步骤4–在里面,您将找到已请求手机相机权限的应用程序列表。步骤5–打开指定应用的“相机”

Windows无法访问指定设备、路径或文件 Windows无法访问指定设备、路径或文件 Jun 18, 2024 pm 04:49 PM

小伙伴电脑出现这样的故障,打开“此电脑”和C盘文件会提示“Explorer.EXEWindows无法访问指定设备、路径或文件。你可能没有适当的权限访问访问该项目。”包括文件夹、文件、此电脑、回收站等,双击都会弹出这样的窗口,右键打开又是正常的。这是系统更新导致,如果你也遇到这样的情况,下面小编教大家如何解决。一,打开注册表编辑器Win+R,输入regedit,或右键开始菜单运行输入regedit;二,定位注册表“计算机\HKEY_CLASSES_ROOT\PackagedCom\ClassInd

Windows永久暂停更新,Windows关闭自动更新 Windows永久暂停更新,Windows关闭自动更新 Jun 18, 2024 pm 07:04 PM

Windows更新可能导致以下一些问题:1.兼容性问题:某些应用程序、驱动程序或硬件设备可能与新的Windows更新不兼容,导致它们无法正常工作或崩溃。2.性能问题:有时,Windows更新可能会导致系统变得更慢或出现性能下降的情况。这可能是由于新的功能或改进需要更多资源来运行。3.系统稳定性问题:某些用户报告称,在安装Windows更新后,系统可能会出现意外的崩溃或蓝屏错误。4.数据丢失:在罕见的情况下,Windows更新可能会导致数据丢失或文件损坏。这是为什么在进行任何重要的更新之前,备份您

使用正则表达式去除 PHP 数组中的重复值 使用正则表达式去除 PHP 数组中的重复值 Apr 26, 2024 pm 04:33 PM

使用正则表达式从PHP数组中去除重复值的方法:使用正则表达式/(.*)(.+)/i匹配并替换重复项。遍历数组元素,使用preg_match检查匹配情况。如果匹配,跳过值;否则,将其添加到无重复值的新数组中。

AMD 发布新 AGESA 固件更新,修复影响 Zen 2 处理器的 Zenbleed 漏洞 AMD 发布新 AGESA 固件更新,修复影响 Zen 2 处理器的 Zenbleed 漏洞 May 03, 2024 pm 04:31 PM

本站5月3日消息,微星公司今天发布了AMDAM4AGESA1.2.0.Ca固件更新,修复了针对AMDRyzen4000系列Zen2APU中的Zenbleed安全漏洞。微星本次发布的固件更新适用于几乎所有X570主板,主要修复了适用于Zen2处理器中CVE-2023-20593,AMD将其归类为中级威胁。本站注:该漏洞追踪编号为CVE-2023-20593,能以每核心每秒30KB的速度窃取机密数据。此攻击会影响CPU上运行的所有软件,包括虚拟机、沙箱、容器和进程。尽管AGESA1.2.0.Ca的目

三星将为微软 MR 头显提供显示屏 设备有望更轻便显示更清晰 三星将为微软 MR 头显提供显示屏 设备有望更轻便显示更清晰 Aug 10, 2024 pm 09:45 PM

近日,三星显示(SamsungDisplay)与微软公司签署了一项重要合作协议。根据协议,三星显示将为微软开发和供应数十万台适用于混合现实(MR)头显设备的OLEDoS面板,而微软正开发一款面向游戏和电影等多媒体内容的MR设备,这款设备预计将在OLEDoS规格确定后推出,主要服务于商用领域,预计最早于2026年交付。OLEDoS(OLEDonSilicon)技术OLEDoS是一种新型显示屏技术,将OLED沉积在硅基板上,相较于传统的玻璃基板,具有更薄、像素更高的特点。OLEDoS显示屏与普通显示

编程是干啥的,学了有什么用 编程是干啥的,学了有什么用 Apr 28, 2024 pm 01:34 PM

1、编程可以用于开发各种软件和应用程序,包括网站、手机应用、游戏和数据分析工具等。它的应用领域非常广泛,覆盖了几乎所有行业,包括科学研究、医疗保健、金融、教育、娱乐等。2、学习编程可以帮助我们提高问题解决能力和逻辑思维能力。编程过程中,我们需要分析和理解问题,找出解决方案,并将其转化为代码。这种思维方式能够培养我们的分析和抽象能力,提高我们解决实际问题的能力。

See all articles