用C++Builder打造網上聊天軟件-MyNetMeeting(1)


隨著Internet 和局域網的飛速發展和普及,越來越多的企事業單位和學校的都已經建成局域網並接上了Internet 。在局域網或Internet 上很需要一些軟件能夠很方便快捷地實現互相發送信息和傳送文件等功能,我們編寫的這個聊天軟件――MyNetMeeting就是用來適應這個要求的。它的功能包括網上聊天或網上會議(NetMeeting),一對一的即時信息交換,以及相互傳送文件。

一.軟件的分析和設計:

現在在網上有很多聊天軟件,例如現在很流行OICQ 可以很方便簡單的實現兩個人之間聊天但是在局域網上比較難實現多人共同通信即NetMeeting,即使有也是要通過互聯網上的Web的聊天室。這樣不僅不夠方便快捷(尤其對於在同一個局域網內的來說),而且還有價格昂貴和安去性不好等諸多問題。比如有時候,一間公司想在網上開一個會議,如果通過互聯網上的聊天室,不僅上網費用高昂,速度又慢,而且還容易洩漏商業秘密,得不償失。針對這個情況,我們就設計出這個集NetMeeting和Oicq功能於一身的軟件--MyNetMeeting。
這個軟件可以在局域網上實現快速的網上通信,既省錢又省時間。而且服務端是運行在局域網裡的本地PC機上,既安全又方便管理,而且速度快,方便可靠。服務端可以運行在本地局域網裡的普通PC機內,不用特別的服務器,所以可以大大節省成本,而且實現簡單,不對後台數據庫做出要求。但如果有需要的話,也可以很方便的實現後台數據庫支持。

二.軟件架構:

我們做的聊天軟件包括服務器端部分和客戶端部分。服務器端包括了三個部分,會議內容,在線用戶的暱稱,在線用戶的地址。使用這個聊天軟件的時候,首先要登陸服務器,服務器就把登陸上來的用戶的暱稱和地址登記下來,這樣就可以很方便的監測和管理在線用戶。

 

客戶端包括三部分:第一,網上會議;第二,私聊空間;第三,發送文件。還有右邊有個在線用戶列表列出當前在線的所有用戶。下面時語句輸入框,輸入要發送的信息。



三.軟件的功能和特點:

1.網上聊天和網上會議(NetMeeting)
如右圖所示,網上會議實現的功能是多個人同時一起在網上實時開會,所以一個人發的信息所有在線用戶都可以看得到(類似於聊天室)。左上的Memo就放著會議的內容(什麼時間,誰說過什麼),還有是系統信息(誰在加入了會議,或是誰退出了會議等)。只需在那裡的空白位置進行右擊,按連接服務器,就可以連到服務器裡進行聊天及會議;按字體顏色就可以根據自己的喜好改變字體的顏色;按顯示/隱藏在線用戶,就可以把右面的在線用戶列表顯示或者隱藏起來。左下那個Memo是你要發送的信息,在框裡打上要說的話,按發送或者快捷鍵Alt+S就可以把信息發送出去。右邊是一個在線用戶的列表,隨時都可以看到在線用戶的名單。 (如果想發送個人信息或者傳送文件,在用戶列表中擊鼠標右鍵彈出菜單,選擇發送信息或傳送文件)。



2.私聊空間
私聊空間是用來在線用戶之間一對一發送信息的(其他人無法收到)。

要私聊時,先在在線用戶列表中選擇你私聊的對象,雙擊鼠標左鍵,這時左上的label就會顯示你選擇的私聊對象(右圖中的私聊對像是laixh)。那你就可以單獨地跟你選擇的私聊對象發送信息,說悄悄話啦。具體的操作就像和網上會議操作一樣。

3.傳送文件
如果要傳送文件,可以先點發送文件這一頁,然後在右面的列表中選擇你要傳送文件給那個在線用戶,同樣,"發送文件到:"後面的label會顯示該用戶,之後用瀏覽選擇要傳送的文件(也可以直接把文件以及文件的路徑輸進去),再按發送就可以把文件傳送到你選定的用戶。



四.軟件具體實現

1.軟件平台:Windows98 + Borland C++Builder5.0

2.在實現發送和接收文件中的流數據,我使用了Builder裡面的NerMasters控件中的NMStrm和NMStrmServ兩個控件。 NMStrm控件是一個基於TCP/IP的流控件。它可以接收流數據,然後通過網絡將其發送給服務器。此控件包括一些方法和屬性,例如,設置數據的來源等。 NMStrmServ控件可以接收從客戶端發送來的數據流。流服務器只監聽TCP/IP端口,不負責監聽UDP 端口,默認的端口號是6771。要發送的文件流數據,只需要簡單地調用NMStrm控件地PostIt方法。而當有流數據發送到服務端,觸發NMStrmAerv控件地OnMsg事件時,可以在此事件處理函數中完成文件地顯示等處理工作。

3. WinSock是一組用C語言寫的API,用於通過Internet進行數據傳輸。通過WinSock編程可以獲得更大的靈活性。編寫WinSock應用程序本來是很麻煩的,不過,在C++ Builder 5.0中,您並不需要直接與WinSock中的API打交道,因為C++ Builder 5.0新增加了TClientSocket控件和TserverSocket控件,這兩個控件封裝了Windows的有關API,使得對WinSock的訪問大大簡化。用Socket 建立的連接是建立在TCP/IP協議基礎上的,同時也支持其它相關的協議,如XNS、DECnet以及IPX/SPX等。 Socket的連接必須要建立有一個服務器端(Server)和一個客戶端(Client)。在C++ Builder 5.0中分別用TClientSocket控件和TServerSocket控件來操縱客戶端Socket與服務器端Socket的連接和通信。這兩個控件用於管理服務器和客戶的連接,它們本身並不是Socket對象,操縱Socket對象的是TCustomWinSocket及其派生類,如TClientWinSocket、TserverWinSocket . TServerClientWinSocket等。

Socket之間的連接可以分為三種類型:客戶端連接、監聽連接以及服務器端連接,所謂客戶端連接,是指由客戶端的Socket提出連接請求,要連接的目標是服務器端的Socket。為此,客戶端的Socket必須首先描述它要連接的服務器端Socket(主要是指服務器端Socket的地址和端口號),然後再定位所要連接的服務器端Socket,找到以後,就向服務器端Socket請求連接。當然,服務器端的Socket此時未必正好處於準備好狀態,不過,服務器端的Socket會自動維護客戶請求連接的隊列,然後在它認為合適的時候向客戶端Socket發出"允許連接" (Accept)的信號,這時客戶端Socket與服務器端Socket的連接就建立了。所謂監聽連接,服務器端Socket並不定位具體的客戶端Socket,而是處於等待連接的狀態。當服務器端Socket監聽到或者說接收到客戶端Socket的連接請求,它就響應客戶端Socket的請求建立一個新的Socket句柄並與客戶端連接,而服務器端Socket繼續處於監聽狀態,還可以接收其它客戶端Socket的連接請求。所謂服務器端連接,是指當服務器端Socket接收到客戶端Socket的連接請求後,就把服務器端Socket的描述發給客戶端,一旦客戶端確認了此描述,連接就建立了。在本文中的聊天程序用的就是監聽連接, 即服務器設置連接個數後進行監聽,客戶端進行對服務器端的連接,這樣就可以進行相互通信了。