通訊機制與流程

本單元要用單一的UDP程式在區域網路內建立一個聊天室,任何人上線離線都可以被所有人看到,也可以選擇對象發言,或者廣播訊息給所有線上的人。有趣的是這個聊天室不需要伺服器程式,也是某些區網線上對戰遊戲的基礎架構。

表單建置

請建立如上表單介面,請注意在後續程式中:上線按鍵是Button1,廣播按鍵是Button2,我是誰的文字方塊是TextBox1,訊息內容是TextBox2,線上使用者是ListBox1,訊息看板是ListBox2,顯示為IP的標籤是Label4。

繼承不變的程式碼
以下幾個程式單元與之前的單元相同,直接打開舊專案複製即可。
匯入命名空間:如前面的各單元,這些還是必須的:

還有MyIP與Form_Closing副程式,其中Form_Closing的宣告離線會送出廣播訊息,必須配合下段程式碼才能執行。



啟動監聽與公用變數們

除了之前單元都有用到的變數之外,此地多出了幾個變數需要說明一下:
1. ips集合物件,記錄所有上線客戶的IP(在電腦教室應該是區網內的浮動IP,如192.168.x.x之類的)
2. Port在此被設為常數2013,意義是所有客戶(電腦)都以這個頻道互相通訊,也因此本範例就無法做本機測試了!
3. BC是用來廣播的特殊IP(通常是255.255.255.255),對著這個IP發訊息,效果就是將訊息發給所有本網路區段的人!
在Form1_Load事件之中:
1.取得本機 IP(MyIP)寫到顯示IP的Label4,還是使用之前的副程式 localIP。
2.宣告忽略跨執行緒的錯誤,讓監聽程式可以將收到訊息顯示到主執行緒的表單上

發送訊息的副程式

1.副程式的參數是訊息(msg)、發送目標 IP(ToIP)與給誰(toWhom)
2.傳送的字串格式內容包括:自己的名稱、IP、訊息與對方名稱,都以冒號":"分隔。
請注意:UDP是不會辨識訊息來源IP的!你不講沒人會知道!
3.使用UDP通訊物件U傳送到指定的IP與Port
4.如果傳送的訊息是廣播性質,IP就用之前設定的BC,給誰的名稱(toWhom)使用空字串("")即可!

上線或離線的選擇(Button1)

1.先檢查是否已經寫入姓名?
2.清除可能存在的舊名單(ListBox1)與 IP紀錄(ips)
3.接著就是執行監聽執行緒,用廣播方式宣告自己上線,並將按鍵變成『離線』
3.再按一次當然就是宣告離線並且關閉監聽執行緒了!按鍵變成『上線』

設定為廣播的程式

要發私密訊息時是會先選擇ListBox1上面的某人,所謂廣播就是沒有選特定的人,在此就是清除ListBox1的選項了!

發送自訂訊息的程式(TextBox_KeyDown)

1.在輸入訊息的文字框內按Enter鍵時就被視為要傳送訊息,因此程式寫在KeyDown事件
2.檢查如果按鍵是Enter就進一步看看ListBox1有沒有選項,有的話就發送私密訊息,否則發廣播訊息給所有人!
3.私密訊息要加入看板(ListBox2),廣播訊息則不必,因為訊息也會回傳給自己,收到時再加入看板,否則會重複。
4.清除填寫訊息的文字內容(TextBox2)

監聽副程式
終於來到所有程式的樞紐!監聽副程式必須處理所有通訊產生的狀況:

1.收到某客戶上線(OnLine)的(廣播)訊息時必須將人名記到ListBox1,IP記到 ips集合物件。
   a 同時也回傳一個私密訊息給剛來的人說"AddMe",就是將我加入你的線上名單,這樣他才知道我在線上嘛!
   b 當然如果是自己上線的廣播那就不必了!
2.收到AddMe的訊息時必須將人名記到ListBox1,IP記到 ips集合物件。。
3.收到離線訊息"OffLine"當然就是移除ListBox1的名單與 ips的IP紀錄了!
4.其他訊息就是一般的通訊了!加到訊息看板即可,當然要標記是廣播或私密訊息啦!

此外
至此可以試試看加入電腦教室的聊天室了!只要程式沒寫錯的人都可以上線開講囉!
本程式預設使用 Port 2012,如果大家都沒改,程式寫好整個教室(區網)就在同一個聊天室,如果你怕太亂不好測試,可以約同學一起改一個與其他人不同的 Port就可以形成較私密的群組聊天室了!