1.前言

上網(wǎng)聊天是時(shí)下最流行的交友方式。各大網(wǎng)站推出的聊天室都各具特色。

聊天室主要分為WebChat、BBSChat兩種。BBSChat是基于Telnet的Tcp協(xié)議,是BBS的附設(shè)功能,需要客戶(hù)端Telnet程序。W " /> 肉动漫h黄动漫日本免费观看,大香伊人中文字幕精品,二级毛片在线观看

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP聊天室技術(shù)

php聊天室技術(shù) 黃國(guó)輝

1.前言

上網(wǎng)聊天是時(shí)下最流行的交友方式。各大網(wǎng)站推出的聊天室都各具特色。

聊天室主要分為WebChat、BBSChat兩種。BBSChat是基于TelNET的Tcp協(xié)議,是BBS的附設(shè)功能,需要客戶(hù)端TelNET程序。WebChat則采用瀏覽器方式,實(shí)際上是一個(gè)多人共同使用的CGI程序。其基本原理是把每個(gè)用戶(hù)的發(fā)言通過(guò)瀏覽器傳給系統(tǒng),再由系統(tǒng)收集處理后分發(fā)給特定用戶(hù)。

WebChat一般采用Server Push或Client Pull技術(shù)。兩種技術(shù)的區(qū)別在于使用不同的方式將數(shù)據(jù)分發(fā)給用戶(hù),Server Push是由服務(wù)器將數(shù)據(jù)以多重MIME編碼,推給(push)使用者端,目前較少網(wǎng)站使用這種方式。Client Pull則是用戶(hù)從服務(wù)器拉(pull)所要的數(shù)據(jù)。

最常用的Client Pull就是利用Html語(yǔ)言的Meta標(biāo)簽http-equiv="Refresh" 的屬性,每隔一段時(shí)間就檢查服務(wù)器上是否有新的數(shù)據(jù)。例如,每隔5秒鐘就會(huì)刷新一次頁(yè)面。這種方法簡(jiǎn)單有效,缺點(diǎn)是刷新時(shí)會(huì)產(chǎn)生閃爍的現(xiàn)象;而且為了保持效率,每次刷新都會(huì)把舊的聊天內(nèi)容清除,用戶(hù)想查看或保留對(duì)話(huà)內(nèi)容都很不方便。為此,采用JavaApplet作為聊天室的前端,利用刷新把從服務(wù)器Pull的數(shù)據(jù)通過(guò)JavaApplet來(lái)顯示也是一種解決方案。還有就是本文要介紹的使聊天程序保持連線的方案。方法一,把聊天程序設(shè)置為無(wú)限大,就能使瀏覽器不停地保持下載的連線狀態(tài);方法二,聊天程序中存在著無(wú)限循環(huán),因?yàn)榭梢苑奖愕卦O(shè)置更高級(jí)的功能,所以在此選擇采用。

Web服務(wù)器采用FreeBSD+Apache,原因是兩者的組合具有最強(qiáng)的性能,而且花費(fèi)為零。還需要考慮的是用什么方式來(lái)存放數(shù)據(jù)呢。用文件相對(duì)而言容易實(shí)現(xiàn),但是多人使用,頻繁地對(duì)同一文件進(jìn)行IO操作,難免會(huì)影響效率,況且FreeBSD的IO性能不佳。可以考慮使用RamDisk,將文件整個(gè)放進(jìn)內(nèi)存,以提高速度。或者在內(nèi)存中劃分出一塊高速空間用以數(shù)據(jù)存放。筆者使用的是數(shù)據(jù)庫(kù)方式:MySQL。因?yàn)樵摂?shù)據(jù)庫(kù)就是為大批量用戶(hù)同時(shí)使用而設(shè)計(jì),利用它可以省去設(shè)計(jì)高速空間操作的復(fù)雜編寫(xiě),速度也可得到保證。如將整個(gè)數(shù)據(jù)庫(kù)放進(jìn)內(nèi)存,效果更好。

程序用php+Html+JavaScript編寫(xiě)。聊天室主要是對(duì)Html的Form中的各種元素進(jìn)行操作。JavaScript是基于對(duì)象的語(yǔ)言,對(duì)Html中的各種元素皆當(dāng)作對(duì)象看待,所以每個(gè)元素的方法和屬性都很豐富,操作比較方便。而php只有在Form經(jīng)過(guò)Post后,將Form中的元素轉(zhuǎn)成對(duì)應(yīng)的變量,才能處理用戶(hù)輸入的數(shù)據(jù)。從交互性來(lái)說(shuō)比較差,這也是使用JavaScript的原因。采用php的原因是因?yàn)楸绕鹌渌麮GI語(yǔ)言,其速度和安全性都較佳,開(kāi)發(fā)也比較容易。

2. 不斷刷新的聊天室

一個(gè)標(biāo)準(zhǔn)的聊天室頁(yè)面由三個(gè)Frame組成,分別是顯示在線用戶(hù)的Online、用戶(hù)發(fā)言及功能設(shè)置的Say和顯示聊天內(nèi)容的List。用戶(hù)在Say Frame中敲入發(fā)言?xún)?nèi)容后按發(fā)送,數(shù)據(jù)經(jīng)過(guò)處理后保存在Mysql數(shù)據(jù)庫(kù),同時(shí)被保存的還包括發(fā)言人、聊天對(duì)象及發(fā)言的時(shí)間。用戶(hù)一進(jìn)入聊天室,List Frame從Mysql數(shù)據(jù)庫(kù)中把發(fā)言時(shí)間大于用戶(hù)進(jìn)入時(shí)間的發(fā)言提出顯示出來(lái)。而后續(xù)顯示新的發(fā)言?xún)?nèi)容的關(guān)鍵,在于顯示聊天內(nèi)容的那段程序是無(wú)限循環(huán)的。
List Frame程序概要:
復(fù)制代碼 代碼如下:
$db=mysql_pconnect(localhost,root); #Mysql數(shù)據(jù)庫(kù)連接
mysql_select_db(chat,$db);
顯示歡迎進(jìn)入聊天室
設(shè)置$init為數(shù)據(jù)庫(kù)中發(fā)言時(shí)間比
進(jìn)入時(shí)間大的第一個(gè)數(shù)據(jù)的ID號(hào) #是數(shù)據(jù)提取的標(biāo)志位
while (1==1) { #無(wú)限循環(huán)開(kāi)始
提取從$init到最后的數(shù)據(jù);
while (每一個(gè)數(shù)據(jù)$text) {
$emote=strip_tags($text); #防止用戶(hù)直接輸入Html語(yǔ)言
if (eregi("^/",$emote)) #判斷發(fā)言是否系統(tǒng)命令(以/開(kāi)頭)
系統(tǒng)特殊處理
else 顯示發(fā)言
}
設(shè)置$init為最后數(shù)據(jù)的ID號(hào)
flush(); #清出輸出緩沖,使發(fā)言馬上顯示
sleep(2); #使程序暫停2秒,節(jié)省系統(tǒng)資源
mysql_free_result($result); #釋放數(shù)據(jù)庫(kù)結(jié)果占用的內(nèi)存
}


因?yàn)槌绦驘o(wú)限循環(huán),在每次循環(huán)中輸出的發(fā)言是先置入輸出緩沖區(qū)內(nèi)。通過(guò)flush()馬上把緩沖區(qū)的內(nèi)容向用戶(hù)的List Frame送出,達(dá)到了實(shí)時(shí)的聊天效果。循環(huán)最后要釋放Mysql結(jié)果集占用的內(nèi)存,否則因?yàn)闊o(wú)限循環(huán)的緣故,系統(tǒng)資源很快會(huì)被耗盡。
用戶(hù)在Login后將建立一個(gè)Online的表用于在線用戶(hù)的統(tǒng)計(jì),主要是為了防止User表過(guò)大,程序中頻繁用到的檢索會(huì)拖慢系統(tǒng)的運(yùn)作。這其中用的最多的是Online Frame,在采用Client Pull的Refresh Meta,每隔一段時(shí)間就會(huì)查詢(xún)Online表,以刷新在線的用戶(hù)。如果用戶(hù)不發(fā)言超過(guò)規(guī)定時(shí)間,系統(tǒng)會(huì)調(diào)用自定義函數(shù)將用戶(hù)設(shè)為T(mén)imeOut,強(qiáng)制將其退出聊天室。

3. 用戶(hù)功能簡(jiǎn)介

用戶(hù)的功能設(shè)置在Say Frame中,可以選擇發(fā)言貼圖、說(shuō)話(huà)的語(yǔ)氣等。發(fā)言經(jīng)過(guò)特殊的處理后存儲(chǔ)到Mysql,例如選擇了一個(gè)貼圖后,系統(tǒng)將添加到發(fā)言的前面,就可以實(shí)現(xiàn)貼圖的效果。
對(duì)于聊天室常用到的Emote,例如用戶(hù)A輸入“/hello”按發(fā)送,List Frame中顯示出來(lái)的是“用戶(hù)A愉快地和大家打招呼”,為了保持效率,用戶(hù)輸入的Emote會(huì)原文直接保存到數(shù)據(jù)庫(kù),而解析轉(zhuǎn)換的工作由List Frame來(lái)完成。
悄悄話(huà)只有自己和聊天對(duì)象可以看到,實(shí)現(xiàn)上因?yàn)榘l(fā)言預(yù)先保存有發(fā)言人和聊天對(duì)象,只要做一個(gè)簡(jiǎn)單的判斷即可。還有聊天室常有的屏蔽某用戶(hù)發(fā)言的功能,通過(guò)設(shè)置一個(gè)臨時(shí)的陣列來(lái)實(shí)現(xiàn),沒(méi)必要保存在用戶(hù)的數(shù)據(jù)庫(kù)中。
聊天室人多的時(shí)候,大家爭(zhēng)先發(fā)言常使人眼花繚亂,這時(shí)可以選擇是否屏蔽無(wú)關(guān)的發(fā)言,即意味著只要不是對(duì)所有人和自己的發(fā)言將不會(huì)顯示出來(lái)。當(dāng)然,因?yàn)橄到y(tǒng)會(huì)用特殊的顏色來(lái)標(biāo)識(shí)和自己有關(guān)的發(fā)言,就算不選擇該功能,用戶(hù)還是能快速地從眾多發(fā)言中找到和自己相關(guān)的。
用戶(hù)可以在特定時(shí)間(系統(tǒng)比較空閑時(shí))將當(dāng)天和自己有關(guān)的發(fā)言打包。因?yàn)?a href=/pingce/cunchu/ target=_blank class=infotextkey>存儲(chǔ)發(fā)言的表數(shù)據(jù)增長(zhǎng)速度很快,為保持運(yùn)行效率,系統(tǒng)隔天就會(huì)把它復(fù)制后清空。這樣用戶(hù)檢索打包發(fā)言?xún)?nèi)容就不會(huì)影響聊天系統(tǒng)的運(yùn)作。
出于安全的考慮,聊天室的管理功能是獨(dú)立的,并沒(méi)放在聊天頁(yè)面中。主要有用戶(hù)資料管理和將搗亂用戶(hù)Kick Out(踢人)兩種功能。將用戶(hù)踢出聊天室后將使他在一定的時(shí)間內(nèi)不能再進(jìn)入聊天室。
聊天室的安全要求雖然不象電子商務(wù)那樣高,但如果用戶(hù)被冒名頂替、用戶(hù)的發(fā)言被竊聽(tīng),或者亂踢人,是非常令人不快的。用戶(hù)都要在Login中填寫(xiě)名字和密碼才能進(jìn)入聊天室,但是通過(guò)查看Login的源代碼,雖然不能看到php的部分,Htnl部分的源碼卻顯示Login是調(diào)用Chat.php程序從而進(jìn)入聊天室的。所以為了防止用戶(hù)直接進(jìn)入聊天室,系統(tǒng)會(huì)首先判斷新建立的聊天室是否由Login產(chǎn)生的,不是則退出。同理,在聊天室的List Frame和Post Frame也可加上這樣的防護(hù)。當(dāng)然,在List Frame和Post Frame中檢查用戶(hù)的身份和密碼,就萬(wàn)無(wú)一失了,只是加重了系統(tǒng)的負(fù)擔(dān)。
綜上所述,能看到系統(tǒng)的源代碼無(wú)疑是危險(xiǎn)的開(kāi)端,所以系統(tǒng)的編寫(xiě)盡量用看不到源碼的php;設(shè)置由Login開(kāi)啟的聊天室隱藏了瀏覽器的工具條、狀態(tài)欄等,并且屏蔽了鼠標(biāo)的右鍵及快捷鍵。

4. 總結(jié)

php編寫(xiě)的聊天室具有高效穩(wěn)定的特點(diǎn),是編寫(xiě)網(wǎng)絡(luò)交互程序的最佳選擇。

參考文獻(xiàn):
[1] Rasmus Lerdorf著. php Manual [M].電子文檔,2000


php技術(shù)PHP聊天室技術(shù),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 人人碰在线视频 | 一区二区三区福利视频 | 中文字幕无线观看不卡网站 | 色橹橹欧美在线观看视频高 | 午夜免费体验30分 | 特级做A爰片毛片免费看108 | 啪啪漫画无遮挡全彩h网站 啪啪漫画无遮挡全彩h同人 | 成年人视频在线免费 | 99久久精品国产自免费 | 国产大片51精品免费观看 | 国产麻豆剧看黄在线观看 | 国产精品三级在线观看 | 男人插曲女人身体视频 | 国产 亚洲 中文在线 字幕 | 麻豆婷婷狠狠色18禁久久 | 国产亚洲精品网站在线视频 | 国产精品第八页 | 女教师杨雪的性荡生活 | 边摸边吃奶边做激情叫床视 | 国产成人v视频在线观看 | 国产探花在线精品一区二区 | bdsm中国精品调教ch | 亚洲人成在线播放网站岛国 | 18禁止观看免费私人影院 | 国产东北男同志videos网站 | 91麻豆久久 | 小小水蜜桃免费影院 | 九九热伊人 | 国产在线观看网址你懂得 | 伊人情涩网 | 色婷婷欧美在线播放内射 | 無码一区中文字幕少妇熟女H | 亚洲嫩草AV永久无码精品无码 | 把腿张开JI巴CAO死你H教室 | 伦理片天堂eeuss影院 | 亚洲免费无码中文在线亚洲在 | 一本到道免费线观看 | 狠狠久久免费视频在线 | 出租屋自拍贵在真实15P | 午夜福利理论片高清在线 | 俄罗斯美女z0z0z0在线 |