基於PHP的聊天室編程思想
來源:互聯網
上載者:User
編程|聊天室 1 頁面登陸的基本要素
你可以在我的竹葉看到登陸 的表單,這裡提供了最基本的登陸表單項
(1)登陸表單
<form method=POST name=chatform action=chat/login.php?action=enter onSubmit="b1_submit();return true;" target="howtodo">
(a)聊天表單的名字為chatform,我使用action=enter作為進入聊天室的入口,如果沒有這個參數,則顯示登陸頁 面.
(b)在表單提交時,先調用b1_submit()建立聊天的視窗
(c)聊天的目標視窗為b1_submit()建立 的howtodo視窗
(2)表單項
暱稱:<input type=text name=name size=15 maxlength="10">
密碼:<input type=password name=pass size=15 maxlength="10">
<input type=submit name=submit value=登陸 style="width:100">
<input type=reset name=reset value=重添 style="width:50">
(a)各表單項一定要設定最大允許長度 maxlength
(3)建立聊天視窗的js
<script LANGUAGE="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<count($register);$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<count($useronline);$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("<frameset rows="*,110,0,0,0" border=0> ");
print("<frameset cols="660,118" rows="*"> ");
//主顯示螢幕,負責顯示聊天內容
print("<frame name=u src=about:blank frameborder="NO" noresize> ");
//線上人數螢幕
print("<frame name=r src="about:blank" frameborder="NO">");
print("</frameset> ");
//發送資訊的螢幕,資訊指揮中心,所有指令都要由這裡發出
print("<frame name=d src=send.php?name=$name&&pass=$pass scrolling='no' frameborder="NO" noresize> ");
//被動更新螢幕,處理髮送的資訊
print("<frame src="about:blank" name="bl"> ");
/主動更新螢幕,顯示自己和其他聊友的聊天資訊
print("<frame src="about:blank" name="flush"> ");
//檢測是否線上的螢幕,對於異常 離開,如死機,掉線等的處理
print("<frame src="about:blank" name="check"> ");
print("</frameset> ");
因為各個頁面之間的程式有 聯絡,所以顯示順序很重要,可以看到,我這裡只有發送頁面不是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<($k-1);$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('[線上人數<font color=red>'+count+'</font>]<br>');
document.writeln("[<a href="javascript:parent.cs('所有人')">所有人</a>]<br>");
document.writeln("<font class='p9'>");
var j,name,club;
for(var i=0;i<list.length;i=i+1)
{
if(list[i]!=null){
//顯示每個線上人的名字
document.writeln("<a href="javascript:parent.cs('"+list[i]+"')" title='"+list[i]+"'>"+list[i]+"</a><br>");
}
}
this.r.document.writeln('</font><hr>');
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<list.length;i=i+1)
{
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<list.length;i=i+1)
if(list[i]==str)
{
delete list[i];
count--;
}
}
5增加一個使用者
function add(str1,str2)
{
var l=list.length;
for(var i=0;i<list.length;i=i+1)
//如果已經在數組裡面則返回
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下面是基本的發送表單代碼
<form name=inputform action='messagesend.php' target='bl' >
<?
//讀入最大的發言數目
$message = file($filename);
$number = chop($message[0]);
//從上次顯示的下一個發言開始到最大發言結束,顯示發言內容
for($i=$last+1;$i<=$number;$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; ");
?>
</script>
這樣,每個發送的發言,經過被動更新程式處理儲存到檔案內,然後由一個迴圈的主動更新程式完成顯示任
務!!!