




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C中Socket 多線程編程實(shí)例C#中Socket多線程編程實(shí)例 2010年07月18日星期日10:58是微軟隨著新推出的一門語言。它作為一門新興的語言,有著 C++的強(qiáng)健,又有著 VB等的RAD特性。而且,微軟推出 C#主要的目的是為了對抗 Sun公司的Java。大家都知道Java語言的強(qiáng)大功能,尤其在網(wǎng)絡(luò)編程方面。于是, C#在網(wǎng)絡(luò)編程方面也自然不甘落后于人。本文就向大家介紹一下 C#下實(shí)現(xiàn)套接字(Sockets)編程的一些基本知識,以期能使大家對此有個(gè)大致了解。首先,我向大家介紹一下套接字的概念。套接字基本概念:套接字是通信的基石,是支持 TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。可以將套接字看作不同主機(jī)間的進(jìn)程進(jìn)行雙向通信的端點(diǎn),它構(gòu)成了單個(gè)主機(jī)內(nèi)及整個(gè)網(wǎng)絡(luò)間的編程界面。套接字存在于通信域中,通信域是為了處理一般的線程通過套接字通信而引進(jìn)的一種抽象概念。套接字通常和同一個(gè)域中的套接字交換數(shù)據(jù)(數(shù)據(jù)交換也可能穿越域的界限,但這時(shí)一定要執(zhí)行某種解釋程序)。各種進(jìn)程使用這個(gè)相同的域互相之間用 Internet 協(xié)議簇來進(jìn)行通信。套接字可以根據(jù)通信性質(zhì)分類,這種性質(zhì)對于用戶是可見的。應(yīng)用程序一般僅在同一類的套接字間進(jìn)行通信。不過只要底層的通信協(xié)議允許,不同類型的套接字間也照樣可以通信。套接字有兩種不同的類型:流套接字和數(shù)據(jù)報(bào)套接字。套接字工作原理:要通過互聯(lián)網(wǎng)進(jìn)行通信,你至少需要一對套接字,其中一個(gè)運(yùn)行于客戶機(jī)端,我們稱之為 ClientSocket ,另一個(gè)運(yùn)行于服務(wù)器端,我們稱之為ServerSocket。根據(jù)連接啟動(dòng)的方式以及本地套接字要連接的目標(biāo),套接字之間的連接過程可以分為三個(gè)步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認(rèn)。所謂服務(wù)器監(jiān)聽,是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)。所謂客戶端請求,是指由客戶端的套接字提出連接請求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求。所謂連接確認(rèn),是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求,它就響應(yīng)客戶端套接字的請求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。C#中的套接字編程實(shí)例:通過向大家簡單的介紹套接字的基本概念和實(shí)現(xiàn)套接字編程的基本原理,我想大家對套接字編程已有了初步的了解。不過,上面介紹的僅僅是基本概念和原理,要真正運(yùn)用還是需要一定的工作的。對基本概念和原理的真正理解的最好方法莫過于自己動(dòng)手做一個(gè)實(shí)例,下面我就向大家介紹一個(gè)很好的用 C#實(shí)現(xiàn)套接字編程的實(shí)例――聊天室程序。本程序是基于C/S(服務(wù)器/客戶端)構(gòu)架的,程序包含一個(gè)服務(wù)器端的應(yīng)用程序和一個(gè)客戶端的應(yīng)用程序。首先,在服務(wù)器上運(yùn)行服務(wù)器端的應(yīng)用程序,該程序一運(yùn)行就開始服務(wù)器監(jiān)聽。然后,在客戶機(jī)上就可以打開客戶端的應(yīng)用程序。程序打開后可以與服務(wù)器端應(yīng)用程序進(jìn)行連接,即進(jìn)行客戶端請求。在連接確認(rèn)后,客戶端用戶可以和其他的客戶端用戶進(jìn)行聊天??蛻舳巳藬?shù)沒有限制,同時(shí)還支持 "悄悄話"聊天模式,支持聊天記錄。所以這是一個(gè)學(xué)習(xí)套接字編程的相當(dāng)不錯(cuò)的例子。而且,程序中為了處理每個(gè)客戶端的信息還用到了多線程機(jī)制。在每個(gè)客戶端與服務(wù)器端連接成功后,它們之間就建立一個(gè)線程。這樣運(yùn)用了多線程之后,客戶端之間就不會(huì)相互影響,即使其中一個(gè)出了錯(cuò)誤也不會(huì)影響到另一個(gè)。下面,我就向大家具體介紹該實(shí)例:服務(wù)器端程序:打開,新建一個(gè)C#的模板為"Windows應(yīng)用程序"的項(xiàng)目,不妨命名為"ChatServer"。布置界面。只需在界面上添加一個(gè)ListBox控件即可,該控件主要用于顯示客戶端的用戶的一些信息的。圖象如下:服務(wù)器端程序的代碼編寫。對于服務(wù)器端,主要的作用是監(jiān)聽客戶端的連接請求并確認(rèn)其請求。程序一開始便打開一個(gè) StartListening() 線程。privatevoidStartListening(){listener=newTcpListener(listenport) ;();while(true){try{Sockets=() ;clientsocket=s ;clientservice=newThread(newThreadStart(ServiceClient)) ;();}catch(Exceptione){;}}}該線程是一直處于運(yùn)行狀態(tài)的。當(dāng)服務(wù)器端接收到一個(gè)來自客戶端的連接請求后,它就打開一個(gè) ServiceClient() 線程來服務(wù)客戶端。當(dāng)一個(gè)連接被建立后,每個(gè)客戶端就被賦予一個(gè)屬于它自己的套接字。同時(shí),一個(gè) Client 類的對象被建立。該對象包含了客戶端的一些相關(guān)信息,該信息被保存在一個(gè)數(shù)組列表中。Client 類如下:usingSystem;using ;namespaceChatServer{using ;using ;開,新建一個(gè)C#的模板為"Windows應(yīng)用程序"的項(xiàng)目,不妨命名為"ChatClient" 。布置界面。往界面上添加一個(gè)ListBox控件(用于顯示用戶列表),一個(gè)RichTextBox控件(用于顯示聊天消息以及系統(tǒng)消息),一個(gè)TextBox控件(用于發(fā)送消息),一個(gè)CheckBox控件(確定是否為悄悄話),一個(gè)StatusBar控件以及四個(gè)Button控件(分別為"連接"、"斷開連接"、"開始記錄"、"發(fā)送")。各個(gè)控件的屬性設(shè)置可以參見源代碼中的具體設(shè)置,這里從略。界面設(shè)計(jì)好后的圖象如下:客戶端程序的代碼編寫。當(dāng)客戶端試圖和服務(wù)器端進(jìn)行連接時(shí),一個(gè)連接必須建立而且得向服務(wù)器端進(jìn)行注冊。EstablishConnection() 函數(shù)運(yùn)用一個(gè)TcpClient 來和服務(wù)器端取得連接,同時(shí)創(chuàng)建一個(gè) NetworkStream來發(fā)送消息。還有,端口號和服務(wù)器端的是保持一致的,均為 5555。EstablishConnection() 函數(shù)如下:privatevoidEstablishConnection(){="正在連接到服務(wù)器";try{clientsocket=newTcpClient(serveraddress,serverport) ;ns=();sr=newStreamReader(ns);connected=true;}catch(Exception){("不能連接到服務(wù)器!","錯(cuò)誤",;="已斷開連接";}}在和服務(wù)器端連接成功后,程序就用 RegisterWithServer() 函數(shù)向服務(wù)器端發(fā)送一個(gè) CONN命令。該命令先是發(fā)送該用戶的名稱,然后從服務(wù)器端獲得其他所有用戶的列表,所有用戶列表是在 ListBox 控件中顯示的。該函數(shù)如下:privatevoidRegisterWithServer(){try{stringcommand="CONN|"+;Byteoutbytes= ;(outbytes,0, ;stringserverresponse=() ;();stringtokens=(newChar{'|'}) ;if(tokens[0]=="LIST"){="已連接";=true;}for(intn=1 ;nchar{'"r','"n'})) ;=clientname+":已連接到服務(wù)器";}catch(Exception){("注冊時(shí)發(fā)生錯(cuò)誤!","錯(cuò)誤",,;}}在此之后,當(dāng)然就是用戶之間的聊天了,由 ReceiveChat()函數(shù)來完成。該函數(shù)是一個(gè)獨(dú)立的線程,它處理所有用戶獲得的消息和用戶發(fā)送的消息。它主要處理了CHAT、PRIV、JOIN、GONE、QU99v等命令,處理的方法和服務(wù)器端的類似。具體函數(shù)實(shí)現(xiàn)如下:privatevoidReceiveChat(){boolkeepalive=truewhile(keepalive){try{
;Bytebuffer=newByte[2048]
;(buffer,0,
;stringchatter=
;stringtokens=(newChar{'|'})if(tokens[0]=="CHAT"){
;(tokens[1])if(logging)
;(tokens[1])
;}if(tokens[0]=="PRIV"){("Privatefrom") ;(tokens[1].Trim()) ;(tokens[2]+""r"n") ;if(logging){("Privatefrom") ;(tokens[1].Trim()) ;(tokens[2]+""r"n") ;}}if(tokens[0]=="JOIN"){(tokens[1].Trim()) ;("hasjoinedtheChat"r"n") ;if(logging){(tokens[1]+"hasjoinedtheChat") ;}stringnewguy=tokens[1].Trim(newchar{'"r','"n'}) ;;}if(tokens[0]=="GONE"){(tokens[1].Trim()) ;("haslefttheChat"r"n") ;if(logging){(tokens[1]+"haslefttheChat") ;}char{'"r','"n'})) ;}if(tokens[0]=="QU99v"){();();keepalive=false ;="服務(wù)器端已停止";connected=false;=false;=false;}}catch(Exception){}}}通過以上的一些函數(shù),客戶端程序之間就可以進(jìn)行自由地聊天了,各個(gè)用戶之間還可以互相發(fā)送悄悄話。所以程序已經(jīng)實(shí)現(xiàn)了聊天室的基本功能了,不過最后各個(gè)用戶還要正常地退出,那就要用到 QuitChat() /r
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三元催化轉(zhuǎn)換器相關(guān)行業(yè)投資規(guī)劃報(bào)告
- 汽車租賃服務(wù)免責(zé)聲明書
- 數(shù)學(xué)《平面幾何初步》教學(xué)計(jì)劃
- 碳匯項(xiàng)目開發(fā)與合作協(xié)議
- 環(huán)境污染防治專用設(shè)備相關(guān)項(xiàng)目投資計(jì)劃書范本
- 公路管理與養(yǎng)護(hù)服務(wù)相關(guān)行業(yè)投資規(guī)劃報(bào)告
- 空心槳葉干燥機(jī)相關(guān)項(xiàng)目投資計(jì)劃書范本
- 高端人才培訓(xùn)與交流合作協(xié)議
- 藥物臨床試驗(yàn)倫理審查工作指導(dǎo)原則
- 老人照護(hù)服務(wù)相關(guān)管理制度
- 2024年中華人民共和國企業(yè)所得稅年度納稅申報(bào)表(帶公式)20240301更新
- 2024年江蘇省揚(yáng)州市中考數(shù)學(xué)真題(解析版)
- 中醫(yī)養(yǎng)生保健知識講座完整版
- 托福聽力課件
- 泰康集團(tuán)線上測評真題
- 騰訊社招測評題庫
- 運(yùn)動(dòng)損傷的預(yù)防與處理預(yù)防和處理舞蹈運(yùn)動(dòng)損傷
- 物流無人機(jī)項(xiàng)目企業(yè)運(yùn)營實(shí)施方案
- 家鄉(xiāng)二聲部合唱譜
- 某住宅樓招投標(biāo)文件
- 成語故事-引狼入室
評論
0/150
提交評論