----Internet上的通訊協(xié)議是TCP/ip,Internet上數(shù)據(jù)傳輸協(xié)議主要有TCP和UDP,TCP是有連接協(xié)議,它要求計(jì)算機(jī)進(jìn)行對(duì)話(huà)時(shí)必須先建立連接,保證數(shù)據(jù)傳送安全到達(dá)目的地。UDP是無(wú)連接協(xié)議,它只是將信息送到網(wǎng)絡(luò)上,并不檢查數(shù)據(jù)是否到達(dá)了目的地。要進(jìn)行實(shí)時(shí)會(huì)話(huà),則應(yīng)該采用TCP協(xié)議。本程序采用的協(xié)議就是TCP協(xié)議。
----程序分服務(wù)和客戶(hù)程序兩部分。客戶(hù)程序啟動(dòng)后首先與服務(wù)器連接,連接成功后,隨意輸入一個(gè)名字即可進(jìn)入聊天室;服務(wù)程序則負(fù)責(zé)維護(hù)與每一個(gè)客戶(hù)的連接和數(shù)據(jù)交換,并且記錄下所有聊天內(nèi)容,及人員名單。由于在會(huì)話(huà)過(guò)程中大家起的都是假名字,不可避免地要有的人講一些不健康內(nèi)容,為了保持秩序,服務(wù)器程序?qū)崿F(xiàn)了IP地址跟蹤功能。管理人員可以很容易地查找出每一個(gè)匿名的計(jì)算機(jī)名,并對(duì)之進(jìn)行警告或其它處理(下面會(huì)進(jìn)一步介紹)。可保證會(huì)話(huà)內(nèi)容的健康。如果服務(wù)器程序關(guān)閉,則所有客戶(hù)程序自動(dòng)關(guān)閉。
VB5的Winsock控件
----VB5企業(yè)版提供了Winsock控件,要實(shí)現(xiàn)兩臺(tái)計(jì)算機(jī)的對(duì)話(huà),可以通過(guò)Winsock控件進(jìn)行。而不需了解更多的數(shù)據(jù)傳輸細(xì)節(jié),本程序就是通過(guò)Winsock進(jìn)行的。----Winsock有多種屬性、方法和事件,本文只列舉出要使用的屬性、方法和事件。
----......
----一個(gè)Winsock控件可以建立與一個(gè)計(jì)算機(jī)的聯(lián)接,服務(wù)器程序中首先設(shè)置一個(gè)Winsock控件,將其索引值設(shè)為0,以便在運(yùn)行時(shí)動(dòng)態(tài)增減元素,這樣可以與多個(gè)計(jì)算機(jī)進(jìn)行對(duì)話(huà)。
程序介紹
----服務(wù)程序部分
----服務(wù)器程序啟動(dòng)時(shí),先設(shè)置自己的本地端口,因?yàn)橛行┒丝谟衅涔潭ǖ淖饔茫?0是WWW端口,故盡可能選擇不可能使用的端口,這里我選擇了1600。將連接狀態(tài)設(shè)置為假,然后開(kāi)始進(jìn)行偵聽(tīng)。當(dāng)偵聽(tīng)到有計(jì)算機(jī)要求與服務(wù)器進(jìn)行對(duì)話(huà),就接受,并記錄下客戶(hù)機(jī)的地址、端口、客戶(hù)起的匿名,將連接狀態(tài)設(shè)置為真,將上述內(nèi)容存入一個(gè)用戶(hù)自定義的數(shù)組中,進(jìn)行動(dòng)態(tài)維護(hù)。用戶(hù)自定義數(shù)據(jù)類(lèi)型如下:
PRivateTypeActiveUser
ClientIPAsString記錄客戶(hù)的IP地址
ClientNameAsString記錄客戶(hù)的匿名
ClientPortAsInteger記錄當(dāng)前會(huì)話(huà)的端口
ClientConnectedAsBoolean
客戶(hù)連接狀態(tài),True表示已連接,F(xiàn)alse表示沒(méi)有連接
EndType
----做完這些工作后,服務(wù)器再調(diào)入一個(gè)新控件,進(jìn)行新的偵聽(tīng),如此反復(fù)不斷。如果有客戶(hù)退出,則關(guān)閉相應(yīng)的連接。注意不能在客戶(hù)端關(guān)閉連接,否則會(huì)產(chǎn)生錯(cuò)誤,只能由服務(wù)器關(guān)閉連接。服務(wù)器程序主要對(duì)象設(shè)置
.
.
.
----利用上述對(duì)象可以實(shí)現(xiàn)服務(wù)器的各種功能,當(dāng)然,還可以再加入新控件,以使界面更美觀。
----服務(wù)程序中三個(gè)關(guān)鍵程序段如下:
----1.處理連接請(qǐng)求
----sckServer_ConnectionRequest過(guò)程處理連接請(qǐng)求,當(dāng)遠(yuǎn)程計(jì)算機(jī)要求連接時(shí),服務(wù)器首先檢查用戶(hù)自定義數(shù)組中是否有空閑位置(因?yàn)樵谡勗?huà)中途,肯定會(huì)有人退出,所以會(huì)產(chǎn)生空閑位置),如果有則選擇空閑位置給予要求連接的客戶(hù),否則將數(shù)組維數(shù)加一,將之給予請(qǐng)求連接的遠(yuǎn)程節(jié)點(diǎn)。錯(cuò)誤處理主要是忽略?xún)蓚€(gè)或兩個(gè)以上的客戶(hù)同時(shí)要求連接時(shí)產(chǎn)生的地址沖突現(xiàn)象。
----......
----2.處理處于連接狀態(tài)的用戶(hù)發(fā)送來(lái)的信息
----sckServer_DataArrival過(guò)程處理客戶(hù)端傳來(lái)的數(shù)據(jù)。當(dāng)有數(shù)據(jù)發(fā)送過(guò)來(lái)后,服務(wù)器首先接收數(shù)據(jù),調(diào)用自定義過(guò)程HandleOtherMessage檢查是談話(huà)內(nèi)容還是其它信息,如果是其它信息,則在HandleOtherMessage中進(jìn)行處理,否則在本過(guò)程中進(jìn)行處理。
----因?yàn)閃insock控件將數(shù)據(jù)首先送至緩沖區(qū),待緩沖區(qū)滿(mǎn)才發(fā)送信息,這顯然不能保證適時(shí)對(duì)話(huà),用Doevents語(yǔ)句可確保Windows將數(shù)據(jù)及時(shí)送出。其中的錯(cuò)誤處理程序處理當(dāng)遠(yuǎn)程計(jì)算機(jī)非正常關(guān)閉程序時(shí)產(chǎn)生的錯(cuò)誤,因?yàn)榇藭r(shí)服務(wù)器并不知道它已關(guān)閉,仍然向它發(fā)送信息,這樣就會(huì)產(chǎn)生錯(cuò)誤,導(dǎo)致服務(wù)程序關(guān)閉,中斷整個(gè)談話(huà)。處理方法只是簡(jiǎn)單地關(guān)閉掉該連接即可。
----......
----3.關(guān)閉客戶(hù)連接
----sckServer_Close過(guò)程關(guān)閉與客戶(hù)的連接,刪除控件,收回系統(tǒng)資源,將該位置的連接狀態(tài)設(shè)置為假,以便有用戶(hù)請(qǐng)求連接時(shí)繼續(xù)使用。它一般由HandleOtherMessage過(guò)程調(diào)用
----......
----如何保證聊天內(nèi)容的健康是一個(gè)很重要的方面,在Internet上,我們對(duì)談話(huà)內(nèi)容不健康者,只有將之開(kāi)除出聊天室。但在局域網(wǎng)上則可以查出是誰(shuí)談話(huà)不文明(局域網(wǎng)環(huán)境為WindowsNT4.0服務(wù)器,Windows95工作站)。方法如下:在95工作站上將網(wǎng)絡(luò)中的TCP/IP協(xié)議中的IP地址選項(xiàng)設(shè)為動(dòng)態(tài)獲得IP地址,在NT服務(wù)器上用DHCP管理工具為每一個(gè)客戶(hù)機(jī)進(jìn)行IP地址動(dòng)態(tài)分配。聊天服務(wù)程序記錄下來(lái)了每一個(gè)客戶(hù)的IP地址,我們就可以通過(guò)DHCP管理工具很容易地查出某IP地址對(duì)應(yīng)的計(jì)算機(jī)名,并進(jìn)行處理。
客戶(hù)程序部分
----客戶(hù)程序啟動(dòng)時(shí)首先設(shè)置服務(wù)器的地址及端口,這里我直接使用了“192.168.0.2”,這是我的服務(wù)器地址,可以在Form_load過(guò)程中設(shè)置你自己的服務(wù)器地址,也可在程序開(kāi)始時(shí)讓用戶(hù)輸入服務(wù)器地址以增加靈活性。時(shí)鐘控件用以與遠(yuǎn)程節(jié)點(diǎn)進(jìn)行自動(dòng)連接。----......
----客戶(hù)程序主要對(duì)象設(shè)置
----......
----“”顯示所有正在聊天室中的用戶(hù)名
----顯示當(dāng)前的狀態(tài)(用戶(hù)名,IP地址及是否密談)
----與服務(wù)器程序一樣,這里列出的并非全部的控件,但是已經(jīng)足以完成工作。
----客戶(hù)程序中的自定義類(lèi)MyMessage用來(lái)記錄自己的信息,
----......
----類(lèi)中的變量cmdExitClick用來(lái)記錄用戶(hù)是否按了退出按鈕,如果是按了退出按鈕則為真。當(dāng)用戶(hù)選擇了系統(tǒng)的窗體關(guān)閉菜單而沒(méi)有按退出按鈕時(shí)將會(huì)產(chǎn)生錯(cuò)誤,因此用它來(lái)記錄是如何退出的,如果選擇了系統(tǒng)的窗體關(guān)閉菜單,則執(zhí)行一次cmdExit_Click()過(guò)程,以確保無(wú)誤。
----客戶(hù)退出時(shí),不是簡(jiǎn)單地關(guān)閉自己的Winsock控件,而是發(fā)送一個(gè)字符串(我采用了一個(gè)大家在聊天時(shí)很難用到的字符串“=_RE”)給服務(wù)器,表明自己要退出,由服務(wù)器端關(guān)閉連接,進(jìn)而關(guān)閉自身。
->
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注