用ASP構築首頁聊天室

來源:互聯網
上載者:User
聊天室|聊天室 在首頁上擁有一個聊天室,會給你的首頁空間增添許多情趣,特別是在 Intranet 或區域網路內更是樂趣無窮。然而傳統的CGI編程是一件頭疼的事,隨著 ASP技術的流行,製作首頁聊天室不再是件可怕的事情。跟我一步步的來吧,擁有你自己的聊天室空間。
一、首頁聊天室的原理
1、首頁聊天室其實並不神秘,名成員間相互連信的方式並非像所表現的那樣建立直接的串連,而是通過web伺服器作為中介。這時在web伺服器更像一個大信箱,裡面裝著很多信,有大家都可以看的公用信,也有私人信件(既悄悄話),感覺上就像真的相互是在直接通訊一樣。
對於ASP 的基本原理就不再敘述了。 構築聊天室的精髓思想就是其內部對象 Application和Session的應用。Application 對象對應了一個全域全域變數的概念,隨 伺服器的啟動關閉而建立刪除。任何一個客戶任何時候改變了它,都會引起改變,所以在聊天[室程式中用Application 對象來儲存公用資訊。Session 對象對應了一個客戶的局部局域的概念,隨客戶開始進入網站頁面時建立,各個客戶擁有一個唯一的Session ID( 此ID儲存在客戶機Cookie中因此要求瀏覽器允許接受Cookie ), Session變數的改變對各客戶是獨立的,而且它可以儲存同一站戰點同一客戶不同網頁上的資料,所以在聊天室程式中用Session對象來儲存聊天成員專用資訊,如聊天代號、悄悄話等。
用ASP構築聊天室充分體現了ASP和CGI程式的差別。CGI程式中,為每一個客戶串連建立一個進程,其對資源的耗費是很大的。而ASP中Application 對象儲存自己資料,共用一個進程空間,因此ASP的效率是很高的。
二、基礎架構的構築
一共需要兩個頁面,一個用作登入介面,一個作主聊天頁面。登入頁面login.asp很簡單,就是一個from 表單,提交後把聊天代號等資訊送給Session變數Session("name'),然後重導航(Response. Redirect mainchat.asp)到首頁面mainchat.asp。主聊天頁面由兩個frame 組成:
frame1中放words.asp頁面,用於顯示聊天內容。frame2中放chat.asp 頁面,用於發送聊天資訊。
2、設定Application和Session 對象
使用Application("show" )存放公用資訊,用Session("name")存放聊天室代號,這是很自然的。悄悄話用什麼存放呢?這裡用了一個很巧妙的方法:用Application(Session("name")存放悄悄話資訊!每一個聊天代號都對應一個Application變數 ,在顯示頁面中用〈% = Application(Session("name")%>將顯示屬於本代號的悄悄話.
3、顯示頁面words.asp的關鍵語句:
<HTML>
<META htpp-equiv="refresh" content="10">// 每10秒鐘重新整理一次頁面
...
<%=Application(Session("name"))%>// 顯示悄悄話,如果有的話
...
<%=Application("show")%>//顯示大眾交談資訊
...

</HTML>
4、chat.asp 主要實現訊息發送,其中包括一個form表單,以填入要說的話及悄悄話接受者(為空白表示公用資訊),提交給chat.asp 自身,將表單資料送到各自的變數中去:要發送的訊息到Application("show"),悄悄話接收者送到Applicatio(Secret)中。Chat.asp 的關鍵語句:
...
Talk=Trim(Request.From("txbox")// 為訊息文本輸入框, //此語句提取要送的訊息內容。
Secret=Trim(Request.Form("secret")//secre為悄悄話接收者文本輸入框 //此語句提取悄悄話接收者。
If Secret=""then
If Talk< >""then //發送公用資訊到Application("show")
Application.lock
Application("show")=Session("name")&":"&Talk&"<br>"&Application("show")
Application.unlock
End if
Else
If Talk< >""then //送出悄悄話資訊。
Application.lock
Application(Secret")=Session("name")&"給你的悄悄話:"& Talk // 此處 Secret為悄悄話接收者的代號,對照Application.unlock //words.asp中悄悄話顯示語句,你會發現只有接收者才會顯示這條悄悄話的,很巧妙吧。
End if
End if
...

這樣,聊天室的基本架構建好了,你可以找幾個朋友進去欲言了。但是還十分簡陋,接下來將給聊天室增添一些重要功能如,線上人數統計、聊天代號列表、聊天動作設計、重新整理時間控制等。
三、聊天室功能擴允
1、線上人數統計
我們設定一個全域的Application("peopenumw")變數存放線上人數,並用一個Session("access")變數表示客戶狀態即是否已進入聊天室。每次登入進入聊天室時,根據ac-cess的狀態對peoplenum進行增一或減一的操作,這樣一來可以避免客戶重複登入以及重複增減計數(比如客戶多次點擊BACK按鈕或FORWARD按鈕)。具體實現為:
進入聊天室時判斷access=0時(未進入聊天室),則在 login.asp頁面提交後可以進入主聊天室,並將peoplenum加一,access標誌置一;當access=1時(已經進入聊天室未正確退出),在進入login..asp頁面時將彈出警示框“你未退出聊天室,請勿重複登入。”並重導航至聊天室內,以讓客戶退出。此時peoplenum不增加。
退出聊衛室時的情況相似,當access=1時,peoplenum減一;當access=0時,peoplenum不變。

可能朋友會提出一個問題,如果使用者非正常退出,比如直接切換地址欄或關閉瀏覽器,能否正確統計出這種人數減員呢?可以的,每個Session都有一個On-SessionEnd事件,當Session結束時觸發運行。因此可以在此事件處理常式中加入:
If Session("access")=1 then
Application.lock
Application("peoplenum")=Application("peoplenum")-1
Application.unlock
End if

這樣,當一個客戶非正常退出一段時間(Session之Timeout屬性決定)以後,會自動減去這個人數的。
2、聊天室代號控制
聊天室代號作為聊天成員的標誌,要求能列出線代號表,且不允許同名。我解決這個問題的辦法是用了VBSCRIPT的一個內建對象Dictionary,它就是一個帶索引值的數組,可以通過方法add、remove進行成員增減,還可以用函數EXISTS判斷某個索引值是否存在,這正好用於防止代號同名。
首先我們要建立一個Dictionary對象,可以在指令碼中用Set Nickname=CreateObject("Scripting.Dictionary")建立,這裡我們也可以在Global.asp中通過(object)標記建立,就可以在任何地方引用它了。
(OBJECT RUNAT="SERVER"SCOPE=APPLICATION ID=ohatname PROID="Scripting.Dictionary")(/OBJECT)
註:Global.asp是放置在網站根目尋下的一個ASP專用檔案,每當web伺服器啟動或關閉時,都會執行Global.asp檔案,故常用作初始化或清理工作。
每次登入時,首先把代號傳給Session("name"),然後
Nickname=Trim(Requeat.form("txtbox"))
...
chatname.add Nickname,Nickname

這樣,在chatname中就儲存了所有線上客戶的代號。
而在每次退出時,要刪除聊天代號:chat-name.remove Session("name")
如何在聊天室中列出線上客戶代號呢?可以把悄悄話文本輸入框改為一個可下拉的列表框,點擊它時下拉顯示所有代號列表,很簡潔方便。
(select name="secrt')
(option Selected)//預設選擇為空白,即不送悄悄話。
(% For=1 to chatname.count-1 %)
(option) (%=chatname.Session("name")%)// 列出所有代號名。
(%Next%)
(/select)
3、聊天室動作設計
如果你常去BBS聊天室的話,一定覺得那些動作很有趣。想在首頁聊天室中加入動作嗎?太容易了,只要你想要。在筆者的聊天室中採用了類BBS的動作模式,(其實模式可以任意,由自己決定了。)比如我輸入“//kick menu“就會顯示“XXX把menu踢得鼻青眼腫”,有趣嗎。實是很簡單的,判斷輸入字元首兩個字元是否為“//”,然後根據後面的單詞選擇顯示的內容。
If Instr(TALK,"//")=1 then
Select case Rtrim(Mid(Talk,3,5))//取“//”後的5個字元
Case "kik"
Application.lock
Application("show")=Session("name")&“把Right(Talk,len (Talk)-7) &“踢得鼻青眼腫。”& Application("show")
Application.unlock
Case...
End Select
End if

這裡使用了VBSCRIPT的幾個字串函數,以提取了Talk中的動作資訊。聊天室的動作可以任意擴充,在筆者的聊天室中就有許多《大話西遊》的台詞呢。
4、其他功能擴充
*設定重新整理時間
在words.asp中用(META http-equiv=“refresh” content=“10”)設定了固定的重新整理時間10秒,但在實際中需要使用者根據情況自己設定重新整理時間,比如在速度較快時希望重新整理時間短,而在速度慢時或想查看過去資訊時希望重新整理時間長些。我們可以在chat.asp加入一個文本輸入框以輸入客戶想要在重新整理時間,將此時間傳給Session(“freshtime”),並把word.asp的那條語句改為:(% Response. Write “(META http-equiv=““refresh””content=“““&Session(“freshtime”)&”””)”%)即可。
*客戶各自獨立地顯示協助列表和控制命令
大家可能注意到了,上面所述的



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.