通訊機制與流程圖
 
本單元要製作一個以網頁為基礎的聊天室程式,相較於前面建立於TCP通訊模式的程式,網頁是以HTTP協定通訊,它的『伺服器』就是網站本身。雖然網站客戶可以主動與網站通訊,告知或詢問網站一些資訊,但是基本上網站不能主動與個別客戶通訊。因此如果網站要告訴客戶一些訊息,如最新的上線人名單或聊天資訊時,只能以公告的方式進行,各個客戶的程式可以定時的監看公告訊息,以決定是否更新自己的頁面內容,這樣還是可以達到即時互動的目的,只是效率比UDP或TCP差一點,好處是不必安裝程式,直接以瀏覽器連上網站即可執行。目前的FaceBook就已經有類似的網頁聊天室的機制,這也是多數網頁互動遊戲的基礎。

建立網站變數
網站的客戶之間的橫向通訊其實建立於網站公用的變數,因此必須在『網站』程式內先宣告建立需要使用的變數,請先新增一個ASP.NET網站,如果是Visual Studio 2010版就會在預設網站內看到一個Global.asax檔案,如是較舊版看不到此檔案就選擇功能表的網站→加入新項目→全域應用類別即可,開啟此檔案之後在Application_Start事件內建立如下程式碼:


在此,原意為應用程式的Application代表整個網站的運作狀態,Application_Start就是網站開張的事件,通常就是網站背後的網頁伺服器啟動,開放可以讓外界客戶連線的時候。Session翻譯成是工作階段,是指某一個客戶在此網站的運作狀態,Session_Start就是某客戶進入此網站的事件。比較特別的是在這些事件中End未必能正確引發,也就是客戶關閉瀏覽器時網站未必知道。上面寫的四行程式解釋如下:
1.線上人員名單
H這個所謂的雜湊表(HashTable)物件是用來記錄線上人員名單的,它的每筆紀錄方式是:(key:人名,value:最後打卡時間)。因為網頁關閉時網站通常是無法偵測到的,因此人還在不在線上必須靠著寫程式讓使用者(的程式)按時向網站打卡報到,已離開網頁的客戶(Session)自然不會繼續打卡,超過一定時間後網站就認定他離線了!我們用第一行的宣告讓程式知道資料型態,但是這個變數無法直接被視為整個網站所有客戶共用的變數,所以需要用第二行的Application("H")封裝它(H)。
2.聊天內容陣列
同樣的,聊天內容在此範例中都是完全公開的(比較像BBS)。它的資料型態被宣告圍佇列(Queue)物件,這也是一個集合物件,特性如同排隊,資料量可以增減,但是永遠堅守先進先出的原則,這樣新資料永遠在後端,資料太多時可以將最舊的資料『擠出來』。本範例是只記最後的五句話。

建立主頁面
接下來在主頁面Default.aspx上面建立如下的介面,如果你使用的是Visual Studio 2010版因為我們不需要它的主板頁面,請刪除預設的Default.aspx,再新增一個Web Form即可:

1.首先加入工具箱AJAX擴充功能類的ScriptManager,這是使用AJAX機制必要的函式庫匯入。
2.接著繼續加入AJAX的UpdatePanel,並在此物件裡面加入一個Timer、ListBox及一個TextBox如上圖。
3.在ListBox及TextBox上面加上文字說明,TextBox的TextMode屬性改為MultiLine(多行模式),Rows設為5(行)。
4.接著要在UpdatePanel的外面加上兩組TextBox與Button按鍵,如圖所示。
5.UpdatePanel是會被網頁程式主動更新的區域,我們要用Timer1物件定時更新裡面的內容,請將Timer1的Interval屬性改為2000,表示兩秒執行一次資料更新,預設值是60000,就是一分鐘更新一次,以聊天室來說太慢了!
6.網頁下方需要使用者輸入資料的物件是不能放在UpdatePanel內部的,因為網頁更新動作會打斷資料的鍵入。
7.請注意TextBox自上而下依序為TextBox1~3。

宣告上線的程式

1.為避免多人同時要改公用變數時資料衝突,所以使用Applicaton.Lock的功能,可以暫時鎖定等我做完再輪別人的意思。
2.將公用變數還原為一個HashTable物件。
3.加入我自己的名字到H物件。
4.重新封裝H到Application("H")等於重新公告出去
5.解鎖 Applicatio_Unlock。

發言的程式

1.取出聊天內容的變數Q(佇列集合物件)
2.將最新發言加入(Enqueue=加入佇列)。
3.如果發言紀錄超過5筆,就擠掉最舊的發言(Dequeue=移出佇列)。

定時更新資料的程式Timer1_Tick

1.首先看如果自己在線上名單應該『打卡』更新時間。
2.接著看看線上名單上的人最後打卡時間是不是超過3秒,如果是,就幫忙把他踢掉更新資料囉!方法是先建一個空的雜湊表NH,合格的先放進去(也顯示於ListBox1),不合格的就不動,整個檢查完畢再將舊的H用心的NH取代掉。
3.後面幾行則是將目前發言內容Q顯示於看板上。

開啟兩個瀏覽器視窗執行畫面大致如下: