資源描述:
《C#__Socket多線程編程實(shí)例》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、C#Socket多線程編程實(shí)例C#是微軟隨著VS.net新推出的一門語(yǔ)言。它作為一門新興的語(yǔ)言,有著C++的強(qiáng)健,又有著VB等的RAD特性。而且,微軟推出C#主要的目的是為了對(duì)抗Sun公司的Java。大家都知道Java語(yǔ)言的強(qiáng)大功能,尤其在網(wǎng)絡(luò)編程方面。于是,C#在網(wǎng)絡(luò)編程方面也自然不甘落后于人。本文就向大家介紹一下C#下實(shí)現(xiàn)套接字(Sockets)編程的一些基本知識(shí),以期能使大家對(duì)此有個(gè)大致了解。首先,我向大家介紹一下套接字的概念。套接字基本概念: 套接字是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)
2、絡(luò)通信的基本操作單元??梢詫⑻捉幼挚醋鞑煌鳈C(jī)間的進(jìn)程進(jìn)行雙向通信的端點(diǎn),它構(gòu)成了單個(gè)主機(jī)內(nèi)及整個(gè)網(wǎng)絡(luò)間的編程界面。套接字存在于通信域中,通信域是為了處理一般的線程通過(guò)套接字通信而引進(jìn)的一種抽象概念。套接字通常和同一個(gè)域中的套接字交換數(shù)據(jù)(數(shù)據(jù)交換也可能穿越域的界限,但這時(shí)一定要執(zhí)行某種解釋程序)。各種進(jìn)程使用這個(gè)相同的域互相之間用Internet協(xié)議簇來(lái)進(jìn)行通信。 套接字可以根據(jù)通信性質(zhì)分類,這種性質(zhì)對(duì)于用戶是可見(jiàn)的。應(yīng)用程序一般僅在同一類的套接字間進(jìn)行通信。不過(guò)只要底層的通信協(xié)議允許,不同類型
3、的套接字間也照樣可以通信。套接字有兩種不同的類型:流套接字和數(shù)據(jù)報(bào)套接字。套接字工作原理: 要通過(guò)互聯(lián)網(wǎng)進(jìn)行通信,你至少需要一對(duì)套接字,其中一個(gè)運(yùn)行于客戶機(jī)端,我們稱之為ClientSocket,另一個(gè)運(yùn)行于服務(wù)器端,我們稱之為ServerSocket。 根據(jù)連接啟動(dòng)的方式以及本地套接字要連接的目標(biāo),套接字之間的連接過(guò)程可以分為三個(gè)步驟:服務(wù)器監(jiān)聽(tīng),客戶端請(qǐng)求,連接確認(rèn)。 所謂服務(wù)器監(jiān)聽(tīng),是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)?! ∷^客戶端請(qǐng)求,
4、是指由客戶端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求。 所謂連接確認(rèn),是指當(dāng)服務(wù)器端套接字監(jiān)聽(tīng)到或者說(shuō)接收到客戶端套接字的連接請(qǐng)求,它就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽(tīng)狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求?!#中的套接字編程實(shí)例: 通過(guò)向大家
5、簡(jiǎn)單的介紹套接字的基本概念和實(shí)現(xiàn)套接字編程的基本原理,我想大家對(duì)套接字編程已有了初步的了解。不過(guò),上面介紹的僅僅是基本概念和原理,要真正運(yùn)用還是需要一定的工作的。對(duì)基本概念和原理的真正理解的最好方法莫過(guò)于自己動(dòng)手做一個(gè)實(shí)例,下面我就向大家介紹一個(gè)很好的用C#實(shí)現(xiàn)套接字編程的實(shí)例――聊天室程序?! ”境绦蚴腔贑/S(服務(wù)器/客戶端)構(gòu)架的,程序包含一個(gè)服務(wù)器端的應(yīng)用程序和一個(gè)客戶端的應(yīng)用程序。首先,在服務(wù)器上運(yùn)行服務(wù)器端的應(yīng)用程序,該程序一運(yùn)行就開(kāi)始服務(wù)器監(jiān)聽(tīng)。然后,在客戶機(jī)上就可以打開(kāi)客戶端的應(yīng)用
6、程序。程序打開(kāi)后可以與服務(wù)器端應(yīng)用程序進(jìn)行連接,即進(jìn)行客戶端請(qǐng)求。在連接確認(rèn)后,客戶端用戶可以和其他的客戶端用戶進(jìn)行聊天??蛻舳巳藬?shù)沒(méi)有限制,同時(shí)還支持“悄悄話”聊天模式,支持聊天記錄。所以這是一個(gè)學(xué)習(xí)套接字編程的相當(dāng)不錯(cuò)的例子。而且,程序中為了處理每個(gè)客戶端的信息還用到了多線程機(jī)制。在每個(gè)客戶端與服務(wù)器端連接成功后,它們之間就建立一個(gè)線程。這樣運(yùn)用了多線程之后,客戶端之間就不會(huì)相互影響,即使其中一個(gè)出了錯(cuò)誤也不會(huì)影響到另一個(gè)。 下面,我就向大家具體介紹該實(shí)例: 服務(wù)器端程序: 1.打開(kāi)VS.
7、net,新建一個(gè)C#的模板為“Windows應(yīng)用程序”的項(xiàng)目,不妨命名為“ChatServer”?! ?.布置界面。只需在界面上添加一個(gè)ListBox控件即可,該控件主要用于顯示客戶端的用戶的一些信息的。圖象如下: 3.服務(wù)器端程序的代碼編寫。對(duì)于服務(wù)器端,主要的作用是監(jiān)聽(tīng)客戶端的連接請(qǐng)求并確認(rèn)其請(qǐng)求。程序一開(kāi)始便打開(kāi)一個(gè)StartListening()線程。privatevoidStartListening(){ listener=newTcpListener(listenport); list
8、ener.Start(); while(true) { try { Sockets=listener.AcceptSocket(); clientsocket=s; clientservice=newThread(newThreadStart(ServiceClient)); clientservice.Start(); } catch(Exceptione) { Console.WriteLine(e.ToString()); } }