第3章 TCP網(wǎng)絡(luò)程序開發(fā)_第1頁
第3章 TCP網(wǎng)絡(luò)程序開發(fā)_第2頁
第3章 TCP網(wǎng)絡(luò)程序開發(fā)_第3頁
第3章 TCP網(wǎng)絡(luò)程序開發(fā)_第4頁
第3章 TCP網(wǎng)絡(luò)程序開發(fā)_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第3章TCP網(wǎng)絡(luò)程序開發(fā)3.1TCP程序開發(fā)主要技術(shù)3.2基于同步TCP的網(wǎng)絡(luò)聊天程序開發(fā)3.3基于異步TCP的網(wǎng)絡(luò)連天程序開發(fā)本章教學主要內(nèi)容3.1TCP程序開發(fā)主要技術(shù)3.1.1使用套接字進行TCP傳輸3.1.2使用TCP類進行網(wǎng)絡(luò)傳輸3.1.3同步和異步3.1.1使用套接字進行TCP傳輸套接字分為兩種:一種是面向連接的(Connection-Oriented)另一種是無連接的(Connectionless)套接字,使用TCP協(xié)議編程的套接字是建立連接的。建立兩個IP地址端點之間的會話,一旦建立了這種連接就可以在設(shè)備之間進行可靠傳輸。根據(jù)連接的啟動方式和本地套接字要連接的目標,套接字的連接過程可分為三個階段:服務(wù)端監(jiān)聽、客戶端請求、確認連接。

服務(wù)器監(jiān)聽:是指服務(wù)器套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)。3.1.1使用套接字進行TCP傳輸

客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務(wù)器的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器套接字的地址和端口號,然后再向服務(wù)器套接字提出連接請求。

連接確認:是指當服務(wù)器套接字監(jiān)聽到客戶端套接字的連接請求時,它就響應(yīng)客戶端套接字的請求,把服務(wù)器套接字的信息發(fā)給客戶端,一旦客戶端確認了此信息,連接即可建立。而服務(wù)器套接字繼續(xù)監(jiān)聽其他客戶端套接字的連接請求。建立連接 服務(wù)器端:SocketlocalSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPHostEntrylocal=Dns.GetHostByName(Dns.GetHostName());IPEndPointiep=newIPEndPoint(local.AddressList[0],1180); localSocket.Bind(iep); localSocket.Accept();3.1.1使用套接字進行TCP傳輸3.1.1使用套接字進行TCP傳輸 客戶端:PAddressremoteHost=IPAddress.Parse("");PEndPointiep=newIPEndPoint(remoteHost,1180);SocketlocalSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

localSocket.Connect(iep);3.1.1使用套接字進行TCP傳輸 發(fā)送和接收消息 服務(wù)器端: SocketclientSocket=localSocket.Accept();//建立連接后,利用Send方法向客戶端發(fā)送信息 clientSocket.Send(Encoding.ASCII.GetBytes("serversendHello")); //接收客戶端信息 byte[]myresult=newByte[1024]; intreceiveNum=clientSocket.Receive(myresult); Console.WriteLine("接收客戶端消息:{0}",Encoding.ASCII.GetString(myresult));3.1.1使用套接字進行TCP傳輸 客戶端 localSocket.Connect(iep);//建立連接成功后,向服務(wù)器發(fā)送信息stringsendMessage="clientsendMessageHello"+DateTime.Now;localSocket.Send(Encoding.ASCII.GetBytes(sendMessage));Console.WriteLine("向服務(wù)器發(fā)送消息:{0}",sendMessage);//接收服務(wù)器信息byte[]result=newByte[1024];3.1.1使用套接字進行TCP傳輸localSocket.Receive(result);Console.WriteLine("接收服務(wù)器消息:{0}",Encoding.ASCII.GetString(result));關(guān)閉連接 localSocket.Shutdown(SocketShutdown.Both); localSocket.Close();3.1.2使用TCP類進行網(wǎng)絡(luò)傳輸TcpClient類TcpClient類在System.Net.Socket命名空間下。主要用于編寫客戶端程序,且需要直接利用構(gòu)造函數(shù)創(chuàng)建TcpClient對象。而服務(wù)器端程序中是通過TcpListener對象的AcceptTcpClient方法得到TcpClient對象的,所以不需要使用TcpClient類的構(gòu)造函數(shù)來創(chuàng)建TcpClient對象。構(gòu)造函數(shù)有四種重載形式TcpClient()TcpClient(AddressFamilyfamily)TcpClient(IPEndPointiep)TcpClient(stringhostname,intport)3.1.2使用TCP類進行網(wǎng)絡(luò)傳輸(1)TcpClient()該構(gòu)造函數(shù)創(chuàng)建一個默認的TcpClient對象,并自動分配本機(客戶端)IP地址和端口號。利用此構(gòu)造函數(shù)創(chuàng)建對象后,還必須調(diào)用Connect方法與服務(wù)器建立連接。例如:TcpClienttcpClient=newTcpClient();tcpClient.Connect("",51888);3.1.2使用TCP類進行網(wǎng)絡(luò)傳輸(2)TcpClient(AddressFamilyfamily)該構(gòu)造函數(shù)創(chuàng)建的TcpClient對象也能自動分配本機(客戶端)IP地址和端口號,但是使用AddressFamily枚舉指定使用哪種網(wǎng)絡(luò)協(xié)議。創(chuàng)建該對象后,必須調(diào)用Connect方法與服務(wù)器建立連接。例如:TcpClienttcpClient=newTcpClient(AddressFamily.InterNetwork);tcpClient.Connect("",51888);3.1.2使用TCP類進行網(wǎng)絡(luò)傳輸(3)TcpClient(IPEndPointiep)

該構(gòu)造函數(shù)的參數(shù)iep指定本機(客戶端)IP地址與端口號。當客戶端有一個以上的IP地址時,而且程序員希望直接指定使用的IP地址和端口號,可以使用這種方式。如果使用這種方式,必須調(diào)用Connect方法與服務(wù)器建立連接。例如:IPAddress[]address=Dns.GetHostAddresses(Dns.GetHostName());IPEndPointiep=newIPEndPoint(address[0],51888);TcpClienttcpClient=newTcpClient(iep);tcpClient.Connect("",51888);3.1.2使用TCP類進行網(wǎng)絡(luò)傳輸(4)TcpClient(stringhostname,intport)

這是使用最方便的一種構(gòu)造函數(shù)。參數(shù)中的hostname表示要連接到的遠程主機的DNS名,port表示要連接到的遠程主機的端口號。該構(gòu)造函數(shù)會自動分配最合適的本地主機IP地址和端口號,并對DNS進行解析,然后與遠程主機建立連接。例如:TcpClienttcpClient=newTcpClient("",51888);它相當于:TcpClienttcpClient=newTcpClient();tcpClientConnect("",51888);3.1.2使用TCP類進行網(wǎng)絡(luò)傳輸TcpClient類的常用屬性屬性含義Client獲取或設(shè)置基礎(chǔ)套接字LingerState獲取或設(shè)置有關(guān)套接字逗留時間的時間NoDelay獲取或設(shè)置一個值,該值在發(fā)送或接收緩沖區(qū)未滿時禁用延遲(true禁用延遲,默認false)ReceiveBufferSize獲取或設(shè)置接收緩沖區(qū)的大?。J8192字節(jié))ReceiveTimeout獲取或設(shè)置套接字接收數(shù)據(jù)的超時時間(毫秒)SendBufferSize獲取或設(shè)置發(fā)送緩沖區(qū)的大?。J8192字節(jié))SendTimeout獲取或設(shè)置套接字發(fā)送數(shù)據(jù)的超時時間(毫秒)3.1.2使用TCP類進行網(wǎng)絡(luò)傳輸TcpClient類的常用方法屬性含義Close釋放TcpClient實例,而不關(guān)閉基礎(chǔ)連接Connect

用指定的主機名和端口號將客戶端連接到TCP主機

BeginConnect

開始一個對遠程主機連接的異步請求

EndConnect

異步接受傳入的連接嘗試

GetStream

獲取能夠發(fā)送和接收數(shù)據(jù)的NetworkStream對象

3.1.2使用TCP類進行網(wǎng)絡(luò)傳輸TcpClient用法舉例:TcpClienttcpClient=newTcpClient();tcpClient.Connect("contosoServer",11000);NetworkStreamnetworkStream=tcpClient.GetStream();networkStream.ReadTimeout=10;byte[]bytes=newbyte[1024];networkStream.Read(bytes,0,1024);stringdata=Encoding.UTF8.GetString(bytes);networkStream.Close();tcpClient.Close();3.1.3同步和異步利用TCP開發(fā)應(yīng)用程序時,.NET框架提供兩種工作方式,一種是同步工作方式(Syschronization),另一種是異步工作方式(Asynchronous)。 同步工作方式是指利用TCP編寫的程序執(zhí)行到監(jiān)聽或就收語句時,在未完成當前工作(偵聽到連接請求或收到對方發(fā)來的數(shù)據(jù))前不在往繼續(xù)往下執(zhí)行。 異步工作方式是指程序執(zhí)行到監(jiān)聽或接收語句時,不論當前工作是否完成,都會繼續(xù)往下執(zhí)行。

3.1.3同步和異步

使用同步TCP編寫服務(wù)器端程序的一般步驟為:創(chuàng)建一個包含采用的網(wǎng)絡(luò)類型、數(shù)據(jù)傳輸類型和協(xié)議類型的本地套接字對象,并將其與服務(wù)器的IP地址和端口號綁定。這個過程可以通過Socket類或者TcpListener類完成。在指定的端口進行監(jiān)聽,以便接受客戶端連接請求。 一旦接受了客戶端的連接請求,就根據(jù)客戶端發(fā)送的連接信息創(chuàng)建與該客戶端對應(yīng)的Socket對象或者TcpClient對象。根據(jù)創(chuàng)建的Socket對象或者TcpClient對象,分別與每個連接的客戶進行數(shù)據(jù)傳輸。根據(jù)傳送信息情況確定是否關(guān)閉與對方的連接。3.1.3同步和異步使用異步TCP編寫客戶端程序的一般步驟為:創(chuàng)建一個包含傳輸過程中采用的網(wǎng)絡(luò)類型、數(shù)據(jù)傳輸類型和協(xié)議類型的Socket對象或者TcpClient對象。使用Connect方法與遠程服務(wù)器建立連接。與服務(wù)器進行數(shù)據(jù)傳輸。完成工作后,向服務(wù)器發(fā)送關(guān)閉信息,并關(guān)閉與服務(wù)器的連接。3.2基于同步TCP的網(wǎng)絡(luò)聊天程序開發(fā)3.2.1功能介紹及界面設(shè)計3.2.2服務(wù)器程序編寫3.2.3客戶端程序編寫3.2.1功能介紹及界面設(shè)計界面設(shè)計 服務(wù)器界面設(shè)計3.2.1功能介紹及界面設(shè)計 客戶端設(shè)計界面3.2.1功能介紹及界面設(shè)計功能介紹服務(wù)器端運行后點擊啟動監(jiān)聽按鈕,監(jiān)聽有無試圖連接到本機的客戶端,當偵聽到有連接到本機的客戶端并且連接成功后,服務(wù)器提示有客戶端登陸,并且服務(wù)器想客戶端發(fā)送“歡迎登陸”的歡迎消息。服務(wù)器端的listBox1上顯示所有連接到他的客戶端,并且服務(wù)器可以選擇任意連接到他的客戶端進行聊天。3.2.1功能介紹及界面設(shè)計運行效果3.2.2服務(wù)器程序編寫創(chuàng)建一個監(jiān)聽類接受和處理服務(wù)器的連接請求。因為當客戶端連接成功后,服務(wù)器端要向客戶端發(fā)送歡迎消息,所以服務(wù)器的監(jiān)聽類還必須處理向客戶端發(fā)送歡迎消息服務(wù)器還要能夠向和客戶端聊天,創(chuàng)建一個發(fā)送類用于向客戶端發(fā)送聊天消息。在Windows窗體應(yīng)用程序中,用戶要有必要的輸入和操作,所以在窗體類中必須也要能夠?qū)崿F(xiàn)相應(yīng)的功能3.2.3客戶端程序編寫 客戶端與服務(wù)器端基本一樣,都要有相應(yīng)的監(jiān)聽類來監(jiān)聽和接收服務(wù)器端發(fā)送過來的信息,也要有相應(yīng)的發(fā)送類向服務(wù)器發(fā)送消息和窗體類來處理用戶的輸入和操作。3.3基于異步TCP的聊天程序開發(fā)

3.3.1異步程序編程方法 3.3.2界面設(shè)計 3.3.3服務(wù)器端程序編寫 3.3.4客戶端程序編寫3.3.1異步程序編程方法使用異步TCP編程時,除了套接字有對應(yīng)的異步操作方式外,TcpListener和TcpClient類均提供了返回結(jié)果為IasyncResult類型的異步操作的方法。見下頁表。3.3.1異步程序編程方法類提供的方法說明TcpListenerBeginAcceptTcpClient開始一個異步操作接受一個傳入的連接嘗試EndAcceptTcpClient異步接受傳入的連接嘗試,并創(chuàng)建新的TcpClient處理遠程主機通信TcpClientBeginConnect開始一個對遠程主機連接的異步請求EndConnect異步接受傳入的連接嘗試SocketBeginReceive開始從連接的Socket中異步接收數(shù)據(jù)EndReceive結(jié)束掛起的異步讀取BeginSend將數(shù)據(jù)異步發(fā)送到連接的SocketEndSend結(jié)束掛起的異步發(fā)送3.3.1異步程序編程方法1.BeginAcceptTcpClient方法和EndAcceptTcpClient方法回調(diào)方法中傳遞的參數(shù)只有一個,而且必須是IAsyncResult類型的接口,它表示異步操作的狀態(tài),如果有多個狀態(tài)需要傳遞,可以將其事先封裝到某個類中

AsyncCallbackcallback=newAsyncCallback(AcceptClient); tcpListener.BeginAcceptTcpClient(callback,tcpListener); …. voidAcceptClient(IAsyncResultar) { …TcpListenermyListener=(TcpListener)ar.AsyncState;TcpClientclient=myListener.EndAcceptTcpClient(ar);…}3.3.1異步程序編程方法1.BeginAcceptTcpClient方法和EndAcceptTcpClient方法程序執(zhí)行BeginAcceptTcpClient方法后,會立即在線程池中自動創(chuàng)建一個線程,同時在該線程中監(jiān)聽客戶端連接請求。一旦接受了客戶端連接請求,就通過委托執(zhí)行相應(yīng)的方法,并返回狀態(tài)信息。 publicIAsyncResultBeginAcceptTcpClient(AsyncCallbackcallback,Objectstate)參數(shù)1:AsyncCallback類型的委托,參數(shù)2:Object類型,用于將狀態(tài)信息傳遞給委托調(diào)用的方法。3.3.1異步程序編程方法2.BeginConnect方法和EndConnect方法

在BeginConnect方法操作完成前,調(diào)用該方法的線程不會阻塞,系統(tǒng)會自動用獨立的線程來執(zhí)行該方法,直到與遠程主機連接成功或拋出異常。publicIAsyncResult

BeginConnect(IPAddressaddress, intport,AsyncCallbackrequestCallback,Objectstate);參數(shù):address為遠程主機的IPAddress對象; port為遠程主機的端口號; requestCallback為AsyncCallback類型的委托; state為包含連接操作的相關(guān)信息,當操作完成時,此對象會被傳遞給requestCallback委托。3.3.1異步程序編程方法2.BeginConnect方法和EndConnect方法…AsyncCallbackrequestCallback=newAsyncCallback(FinishConnect);tcpClient.BeginConnect(遠程主機IP或域名,遠程主機端口號,requestCallback,tcpClient);…voidFinishConnect(IAsyncResultar){…tcpClient=(TcpClient)ar.AsyncState;client.EndConnect(ar);…}在自定義的FinishConnect方法中,通過獲取的狀態(tài)信息得到新的TcpClient類型的對象,并調(diào)用EndConnect完成連接請求。3.3.1異步程序編程方法3.異步發(fā)送和接收數(shù)據(jù)publicoverrideIAsyncResultBeginWrite(byte[]buffer,intoffset,intsize,AsyncCallbackcallback,Objectstate);publicoverrideIAsyncResultBeginRead(byte[]buffer,intoffset,intsize,AsyncCallbackcallback,Objectstate);(1)buffer為字節(jié)數(shù)組,表示用來存放要發(fā)送的數(shù)據(jù),從NetworkStream讀取的數(shù)據(jù);(2)offset用來存放發(fā)送或讀取的數(shù)據(jù)在緩沖區(qū)中的起始位置;(3)size用來存放發(fā)送或接收數(shù)據(jù)的字節(jié)數(shù);(4)callback是異步回調(diào)類型的委托(5)state包含狀態(tài)信息。3.3.2界面設(shè)計服務(wù)器端客戶端3.3.3服務(wù)器端程序編寫

1.在監(jiān)聽類中聲明一個委托ReceiveMessageDelegate用來異步接收客戶端的連接請求,并且寫出相應(yīng)的回調(diào)方法處理請求和消息。privatedelegatevoidReceiveMessageDelegate(outstringreceiveMessage);privateReceiveMessageDelegatereceiveMessageDelegate;//調(diào)用異步方法處理客戶端發(fā)送過來的連接請求和信息receiveMessageDelegate=newReceiveMessageDelegate(ReceiveMessage);//異步操作2IAsyncResultresult=receiveMessageDelegate.BeginInvoke(outreceiveString,null,null);3.3.3服務(wù)器端程序編寫

receiveMessageDelegate.EndInvoke(outreceiveString,result);其中ReceiveMessage是回調(diào)方法,用來處理客戶端的連接請求在發(fā)送類中聲明一個委托SendMessageDelegate用來異步發(fā)送消息給客戶端,并且寫出相應(yīng)的回調(diào)方法發(fā)送消息給客戶端。//聲明委托privatedelegatevoidSendMessageDelegate(stringsendMessage);privateSendMessageDelegatesendMessageDelegate;//調(diào)用異步方法向客戶端發(fā)送數(shù)據(jù)sendMessageDelegate=newSendMessageDelegate(SendMessage);//異步操作3IAsyncResultresult=sendMessageDelegate.BeginInvoke(str.ToString(),null,null);sendMessageDelegate.EndInvoke(result);其中SendMessage是回調(diào)方法,用來向客戶端發(fā)送消息3.3.4客戶端程序編寫

1.在監(jiān)聽類中聲明一個委托ReceiveMessageDelegate用來異步接收客戶端的連接請求,并且寫出相應(yīng)的回調(diào)方法處理請求和消息//聲明委托privatedelegatevoidReceiveMessageDelegate(outstringreceiveMessage);privateReceiveMessageDelegatereceiveMessageDelegate;//調(diào)用異步方法處理客戶端發(fā)送過來的連接請求和信息receiveMessageDelegate=newReceiveMessageDelegate(ReceiveMessage);//異步操作2IAsyncResultresult=receiveMessageDelegate.BeginInvoke(outreceiveString,null,nul

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論