網(wǎng)上交談工具設(shè)計(jì)論文
時(shí)間:2022-08-15 09:31:00
導(dǎo)語:網(wǎng)上交談工具設(shè)計(jì)論文一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
摘要:使用Visualc#.NET中的Socket編程的關(guān)鍵技術(shù),以及多線程的知識(shí)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)上交談工具,它提供的功能有:用戶登錄、顯示所有當(dāng)前的在線用戶、顯示進(jìn)行交談的用戶信息、與選定的用戶進(jìn)行交談,并且支持私人交談。對(duì)于開發(fā)一般性的通信軟件,有一定的參考價(jià)值。
關(guān)鍵詞:SocketTCP協(xié)議服務(wù)器客戶端線程
一、引言
隨著信息技術(shù)的高速發(fā)展,網(wǎng)上交談已成為人們學(xué)習(xí)和工作的重要手段,那么如何設(shè)計(jì)合理的、人性化的網(wǎng)上交談工具就成為當(dāng)務(wù)之急。使用Visualc#.NET中的Socket編程技術(shù),以及多線程的知識(shí)可快速、方便地設(shè)計(jì)理想的網(wǎng)上交談工具。一個(gè)Socket通信無論功能多么齊全、程序多么復(fù)雜,其基本結(jié)構(gòu)均應(yīng)包括以下步驟:創(chuàng)建Socket對(duì)象,建立連接;打開連接到Socket的輸入/輸出流;對(duì)Socket進(jìn)行讀寫操作;關(guān)閉Socket套接字,關(guān)閉流。
二、TCP協(xié)議通信的流程
TCP協(xié)議是面向連接的協(xié)議,它的實(shí)現(xiàn)需要數(shù)據(jù)發(fā)送方和數(shù)據(jù)接收方建立數(shù)據(jù)通信連接,它的具體流程如下:
1.服務(wù)器端首先創(chuàng)建服務(wù)器套接字
2.服務(wù)器套接字監(jiān)聽一個(gè)端口,等待客戶端的請(qǐng)求
3.客戶端創(chuàng)建一個(gè)客戶端套接字
4.客戶端向服務(wù)器發(fā)送連接請(qǐng)求
5.服務(wù)器確認(rèn)與客戶端的連接
6.客戶端和服務(wù)器利用建立的連接進(jìn)行通信
7.通信完畢后,客戶端和服務(wù)器關(guān)閉各自的連接
三、Socket編程簡(jiǎn)介
1.利用Socket建立服務(wù)器程序
要用Socket建立一個(gè)TCP服務(wù)器程序,一般需要以下幾個(gè)步驟:
(1)創(chuàng)建一個(gè)服務(wù)器套接字,用IP地址和端口初始化服務(wù)器
(2)監(jiān)聽服務(wù)器端口
(3)確認(rèn)與客戶端的連接
(4)處理客戶端的請(qǐng)求并回應(yīng)客戶端
(5)斷開客戶端的連接,釋放客戶端的連接
(6)關(guān)閉服務(wù)器,釋放服務(wù)器連接
2.利用Socket建立客戶端程序
要用Socket建立一個(gè)TCP客戶端程序,一般需要以下幾個(gè)步驟:
(1)創(chuàng)建客戶端套接字
(2)連接服務(wù)器
(3)得到與服務(wù)器通信的流通道
(4)向服務(wù)器發(fā)送數(shù)據(jù)
(5)接收從服務(wù)器發(fā)回的數(shù)據(jù)
(6)斷開連接
四、設(shè)計(jì)方案
1.服務(wù)器端的設(shè)計(jì)
服務(wù)器端管理著交談任務(wù),它維持著一張當(dāng)前在線用戶的列表,轉(zhuǎn)發(fā)用戶發(fā)送來的信息,主要功能如下:
監(jiān)聽本機(jī)IP地址中的一個(gè)指定的端口。
當(dāng)有客戶端向該端口發(fā)出請(qǐng)求時(shí),服務(wù)器程序立即建立一個(gè)與該客戶端的連接并啟動(dòng)一個(gè)新的線程來處理該客戶端的所有請(qǐng)求。
根據(jù)客戶端發(fā)送來的各種不同的請(qǐng)求,執(zhí)行相應(yīng)的操作,并將處理結(jié)果返回給該客戶端。服務(wù)器能識(shí)別4種請(qǐng)求命令:CONN(建立新的連接)、CHAT(聊天)、PRIV(私聊)和EXIT(離開),服務(wù)器接收ASCII字符信息,用“|”分隔信息的各個(gè)部分,一條信息包含一條命令,一個(gè)或多個(gè)信息參數(shù)。
2.客戶端的設(shè)計(jì)
客戶端應(yīng)用程序包含用戶登錄窗口和用戶交談的主窗口,它允許用戶登錄到服務(wù)器,可以向服務(wù)器發(fā)送信息,同時(shí)可以接收從服務(wù)器返回的信息,設(shè)計(jì)的主要功能如下:
向遠(yuǎn)程服務(wù)器發(fā)送連接請(qǐng)求。
得到服務(wù)器程序的確認(rèn)后,建立與服務(wù)器的連接,并獲得與服務(wù)器交互的流通道(NetworkStream)。
通過網(wǎng)絡(luò)流通道與服務(wù)器端的程序進(jìn)行數(shù)據(jù)通信。向服務(wù)器發(fā)送服務(wù)器能夠識(shí)別的以上4種命令請(qǐng)求,同時(shí)也接收服務(wù)器發(fā)回的命令。客戶端能夠識(shí)別的命令有JOIN(通知當(dāng)前在線用戶有新的用戶進(jìn)入聊天室)、LIST(更新當(dāng)前在線用戶)和QUIT(關(guān)閉客戶端程序)。客戶端程序接收ASCII字符信息,用“|”分隔信息的各個(gè)部分,一條信息包含一條命令,一個(gè)或多個(gè)信息參數(shù)。五、解決方案
1.服務(wù)器端的實(shí)現(xiàn)
服務(wù)器端是一個(gè)Windows窗體應(yīng)用程序,命名為ChatServer。當(dāng)運(yùn)行服務(wù)器程序時(shí),單擊服務(wù)器窗體上的“啟動(dòng)”按鈕后,便啟動(dòng)了服務(wù)器進(jìn)程。為了使用Socket對(duì)象和Thread對(duì)象,在代碼文件中加入名字空間、..Socket、System..Threading的引用。
在服務(wù)器端使用了多線程,每個(gè)用戶通過一個(gè)單獨(dú)的線程進(jìn)行連接,當(dāng)服務(wù)器開始運(yùn)行時(shí),它就啟動(dòng)一個(gè)線程等待客戶連接(在方法StartListen()中實(shí)現(xiàn))。當(dāng)接收到一個(gè)請(qǐng)求時(shí),服務(wù)器立即啟動(dòng)一個(gè)新的線程來處理和該客戶端的信息交互(在方法ServiceClient()中實(shí)現(xiàn))。自定義了一個(gè)Client類,它用于保存每個(gè)當(dāng)前在線用戶的用戶名和與服務(wù)器連接的Socket對(duì)象。當(dāng)Socket連接一旦建立,就馬上將其保存在一個(gè)Client對(duì)象中,以便讓每個(gè)用戶有自己的Socket,以后可以對(duì)不同用戶的Socket對(duì)象進(jìn)行操作,實(shí)現(xiàn)與客戶端的數(shù)據(jù)交換。
在服務(wù)器窗口中,單擊“啟動(dòng)”按鈕,進(jìn)入btnStart_Click處理程序。在該處理程序中,創(chuàng)建了一個(gè)服務(wù)器套接字并且監(jiān)聽本機(jī)IP地址中的一個(gè)指定的端口,同時(shí)啟動(dòng)一個(gè)線程等待用戶連接(在方法StartListen()中實(shí)現(xiàn))。StartListen()方法是在新的進(jìn)程中進(jìn)行的操作,它主要用于當(dāng)接收到一個(gè)客戶端請(qǐng)求時(shí),確認(rèn)與客戶端的連接,并且立即啟動(dòng)一個(gè)新的線程來處理和該客戶端的信息交互(在方法ServiceClient()中實(shí)現(xiàn))。ServiceClient()方法用于和客戶端進(jìn)行數(shù)據(jù)通信,包括接收客戶端的請(qǐng)求,根據(jù)不同的請(qǐng)求命令,執(zhí)行相應(yīng)的操作,并將處理結(jié)果返回到客戶端,此方法完成了服務(wù)器的主要的工作。SendToClient()方法實(shí)現(xiàn)了向客戶端發(fā)送命令請(qǐng)求的功能,它利用不同用戶保存的Socket對(duì)象,向?qū)?yīng)的用戶發(fā)送命令請(qǐng)求。GetUserList()方法實(shí)現(xiàn)了獲取當(dāng)前在線用戶列表的功能,它通過對(duì)clients數(shù)組的遍歷,獲取當(dāng)前在線用戶的用戶名,用字符串發(fā)回。
2.客戶端的實(shí)現(xiàn)
客戶端是一個(gè)Windows窗體應(yīng)用程序,命名為ChatClient。當(dāng)運(yùn)行客戶端程序時(shí),首先進(jìn)入登錄界面,輸入用戶名,單擊“登錄”按鈕后,進(jìn)入交談主窗口(命名為Login),在主窗口中可以向服務(wù)器發(fā)送信息,同時(shí)可以接收從服務(wù)器返回的信息。
(1)Login.cs文件的實(shí)現(xiàn)
Login.cs文件是登錄窗體的代碼文件,為了使用Socket對(duì)象,在代碼文件中加入名字空間、..Socket的引用,它主要實(shí)現(xiàn)了創(chuàng)建客戶端套接字同時(shí)連接到服務(wù)器指定端口,把用戶名和創(chuàng)建的客戶端套接字傳遞給ChatClient窗體。
(2)ChatClient.cs文件的實(shí)現(xiàn)
ChatClient.cs文件是客戶端窗體(ChatClient)的代碼文件,在該文件中,首先獲得與服務(wù)器通信的流通道,在用戶登錄后,向服務(wù)器發(fā)送CONN命令以此說明有新的用戶進(jìn)入交談室,服務(wù)器將返回所有的當(dāng)前在線用戶的呢稱,選擇不同的人,就可以與他們交談了,如果選中“悄悄話”復(fù)選框,則具有私人交談的功能。
當(dāng)加載ChatClient窗體時(shí),便會(huì)進(jìn)入ChatClientForm_Load處理程序。在該處理程序中,首先顯示用戶登錄窗口。如果登錄成功,那么獲取與服務(wù)器的連接并得到與服務(wù)器數(shù)據(jù)交互的流通道,向服務(wù)器發(fā)送CONN請(qǐng)求命令,同時(shí)啟動(dòng)一個(gè)新的線程用于響應(yīng)從服務(wù)器發(fā)回的信息(在方法ServerResponse()中實(shí)現(xiàn))。ServerResponse()方法用于和服務(wù)器進(jìn)行數(shù)據(jù)通信,主要是接收從服務(wù)器發(fā)回的信息,根據(jù)不同的命令,執(zhí)行相應(yīng)的操作。當(dāng)需要進(jìn)行“私人交談”時(shí),便進(jìn)入priCheckBox_CheckedChanged處理程序。在該處理程序中主要對(duì)privatemode的布爾屬性進(jìn)行設(shè)置。當(dāng)需要發(fā)送信息時(shí),便會(huì)進(jìn)入btnSend_Click處理程序。在該處理程序中,如果privatemode的布爾屬性值為false(不是私人交談),將CHAT命令發(fā)送給服務(wù)器;否則(為私人交談),將PRIV命令發(fā)送給服務(wù)器。當(dāng)用戶需要離開時(shí),便進(jìn)入了btnExit_Click處理程序。在該處理程序中,將EXIT命令發(fā)送給服務(wù)器,停止交談。
六、結(jié)束語
使用Socket編程的關(guān)鍵技術(shù)可以方便地實(shí)現(xiàn)網(wǎng)上交談工具。利用Socket可以創(chuàng)建服務(wù)器程序和客戶端程序。服務(wù)器監(jiān)聽本機(jī)IP地址中的一個(gè)指定的端口,建立與客戶端的連接并啟動(dòng)一個(gè)新的線程來處理客戶端的所有請(qǐng)求,執(zhí)行相應(yīng)的操作,并將處理結(jié)果返回給該客戶端。客戶端向遠(yuǎn)程服務(wù)器發(fā)送連接請(qǐng)求,得到服務(wù)器程序的確認(rèn)后,建立與服務(wù)器的連接,并獲得與服務(wù)器交互的流通道并通過網(wǎng)絡(luò)流通道與服務(wù)器進(jìn)行數(shù)據(jù)通信。我們可以進(jìn)一步進(jìn)行功能完善,進(jìn)而編譯成組件應(yīng)用到自己的應(yīng)用程序中,開發(fā)更完美的通信軟件。
參考文獻(xiàn):
[1]譚桂華魏亮等:VisualC#高級(jí)編程范例.北京:清華大學(xué)出版社,2004年5月
[2]呂偉臣霍言等:VisualC#2005入門與提高.北京:清華大學(xué)出版社,2006年9月
[3]鄒建峰周山峰等:C#企業(yè)級(jí)開發(fā)案例精解.北京:人民郵電出版社,2006年1月