偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C#網(wǎng)絡(luò)編程系列五:TCP編程

開(kāi)發(fā) 后端
首先TCP是一種面向連接的,可靠的,基于字節(jié)流的傳輸層通信協(xié)議。TCP的工作過(guò)程可以分為三個(gè)階段:一、連接的建立; 二、傳輸數(shù)據(jù); 三、斷開(kāi)連接,下面就對(duì)這三個(gè)過(guò)程分別介紹下

前面專題的例子都是基于應(yīng)用層上的HTTP協(xié)議的介紹, 現(xiàn)在本專題來(lái)介紹下傳輸層協(xié)議——TCP協(xié)議,主要介紹下TCP協(xié)議的工作過(guò)程和基于TCP協(xié)議的一個(gè)簡(jiǎn)單的通信程序,下面就開(kāi)始本專題的正文了。

一、TCP的工作過(guò)程

首先TCP是一種面向連接的,可靠的,基于字節(jié)流的傳輸層通信協(xié)議。TCP的工作過(guò)程可以分為三個(gè)階段:一、連接的建立;  二、傳輸數(shù)據(jù); 三、斷開(kāi)連接,下面就對(duì)這三個(gè)過(guò)程分別介紹下:

1.1 連接的建立

TCP的連接建立就像打電話一樣, 我們打電話時(shí),撥一個(gè)號(hào)碼的號(hào)碼并不是立即就可以接通的,期間會(huì)有一個(gè)“嘟 嘟”的呼叫過(guò)程, 這就好比是TCP協(xié)議的連接的建立階段。當(dāng)我們用TCP編寫的程序,必須先建立TCP連接。TCP協(xié)議的連接建立通過(guò)三次握手來(lái)完成的,下面是在網(wǎng)上找的一張TCP三次握手的圖片:

下面就對(duì)這三次握手簡(jiǎn)單的介紹:

第一次握手:建立連接時(shí),客戶端發(fā)送SYN包(seq=x)到服務(wù)器,并進(jìn)入SYN_Send狀態(tài),等待服務(wù)器確認(rèn)

第二次握手:服務(wù)器收到SYN包,必須確認(rèn)客戶的SYN(ACK=x+1),同時(shí)自己也發(fā)送一個(gè)SYN包(SEQ=y),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_Recv狀態(tài)

第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ACK=y+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入Established(建立)狀態(tài),完成三次握手。

簡(jiǎn)單理解三次握手就是發(fā)送一個(gè)檢驗(yàn)包給對(duì)方然后互相確認(rèn),雙方都接到確認(rèn)的一個(gè)信號(hào)時(shí),這時(shí)候雙方就建立了連接(就像我們打電話時(shí),如果沒(méi)人說(shuō)話時(shí)就會(huì)說(shuō)下 “喂”,說(shuō)這句“喂” 也就是希望得到對(duì)方的一個(gè)確認(rèn),雖然這里雙方已經(jīng)建立了連接的,這里只是更形象的說(shuō)明下三次握手的過(guò)程)。

1.2 傳輸數(shù)據(jù)

雙方建立了連接,即在雙方建立了一個(gè)通信通道(就像一座橋一樣,在兩端建立了一個(gè)通路,用橋來(lái)比喻通信通道主要是因?yàn)樽罱幸粍t新聞:哈爾濱陽(yáng)明灘大橋坍塌事件),建立連接之后,當(dāng)然是傳輸我們需要傳輸?shù)臄?shù)據(jù)到對(duì)方的,這里就開(kāi)始簡(jiǎn)單介紹下傳輸數(shù)據(jù)的過(guò)程。

利用TCP傳輸數(shù)據(jù)時(shí),數(shù)據(jù)是以字節(jié)流的形式進(jìn)行傳輸,客戶端與服務(wù)器端建立連接后,發(fā)送方需要先將發(fā)送的數(shù)據(jù)轉(zhuǎn)換為字節(jié)流,然后將其發(fā)送給對(duì)方,發(fā)送數(shù)據(jù)時(shí),可以通過(guò)程序不斷地將數(shù)據(jù)流陸續(xù)寫入TCP的發(fā)送緩沖中,然后TCP自動(dòng)從發(fā)送緩沖中提取一定量的數(shù)據(jù),將其組成TCP報(bào)文段發(fā)送到IP層,再通過(guò)IP層(也就是網(wǎng)絡(luò)層)之下的網(wǎng)絡(luò)接口發(fā)送出去;接受端從IP層接收到TCP報(bào)文段后,將其暫時(shí)保存在接受緩沖中,然后我們通過(guò)程序依次讀取接受緩沖中的數(shù)據(jù),從而達(dá)到相互通信的目的(簡(jiǎn)單的說(shuō)就發(fā)送方把數(shù)據(jù)轉(zhuǎn)換為數(shù)據(jù)流,再把數(shù)據(jù)流存儲(chǔ)在發(fā)送緩沖中,然后傳輸層低層的協(xié)議從發(fā)送緩沖中讀取數(shù)據(jù)把數(shù)據(jù)發(fā)送出去,然后接收端從底層接受到數(shù)據(jù)把數(shù)據(jù)存儲(chǔ)在接收端的緩沖中,然后我們寫的程序只是從緩沖中依次讀取數(shù)據(jù),然后顯示出來(lái),在客戶端我們寫代碼做的事情是把數(shù)據(jù)寫入Write寫入發(fā)送端的緩沖中,然后服務(wù)器端(接收端)用Read方法在自己的緩沖中讀取數(shù)據(jù),用一句話概括,TCP的傳輸就是對(duì)數(shù)據(jù)的寫——讀操作)括號(hào)中的內(nèi)容只是我個(gè)人理解,因?yàn)檫@樣我感覺(jué)理解起來(lái)比較容易,對(duì)于剛開(kāi)始接觸TCP的朋友可以這樣理解,然后再一句句話去擴(kuò)展。

1.3 斷開(kāi)連接

發(fā)送完數(shù)據(jù)之后,最后就是斷開(kāi)連接了,下面是網(wǎng)上斷開(kāi)的連接的一張圖片(斷開(kāi)一個(gè)連接需要經(jīng)過(guò)四次握手)

TCP的工作過(guò)程就分為上面三個(gè)過(guò)程,TCP編程是作為上層應(yīng)用編程的基礎(chǔ),就像之前專題中基于HTTP協(xié)議的Web服務(wù)器,Web瀏覽器,其傳輸層都用的是TCP協(xié)議進(jìn)行傳輸?shù)?,還有基于FTP(文件傳輸協(xié)議),IMAP(交互式郵件存取協(xié)議) POP3(郵局協(xié)議的第3個(gè)版本) 和SMTP(簡(jiǎn)單郵件傳輸協(xié)議)的網(wǎng)絡(luò)應(yīng)用其傳輸層都用的是TCP協(xié)議,而不是UDP等其他傳輸層協(xié)議。

二、基于TCP協(xié)議的簡(jiǎn)單通信程序

這里簡(jiǎn)單實(shí)現(xiàn)了一個(gè)客戶端與服務(wù)器間的通信程序,核心代碼為:

客戶端連接服務(wù)器端代碼:

  1. private void btnConnect_Click(object sender, EventArgs e)  
  2.        {  
  3.            // 通過(guò)一個(gè)線程發(fā)起請(qǐng)求,多線程  
  4.            Thread connectThread = new Thread(ConnectToServer);  
  5.            connectThread.Start();  
  6.        }  
  7.  
  8.        // 連接服務(wù)器方法,建立連接的過(guò)程  
  9.        private void ConnectToServer()  
  10.        {  
  11.            try 
  12.            {  
  13.                // 調(diào)用委托  
  14.                statusStripInfo.Invoke(showStatusCallBack, "正在連接...");  
  15.                if (tbxserverIp.Text == string.Empty || tbxPort.Text == string.Empty)  
  16.                {  
  17.                    MessageBox.Show("請(qǐng)先輸入服務(wù)器的IP地址和端口號(hào)");  
  18.                }  
  19.  
  20.                IPAddress ipaddress = IPAddress.Parse(tbxserverIp.Text);  
  21.                tcpClient = new TcpClient();               
  22.                tcpClient.Connect(ipaddress, int.Parse(tbxPort.Text));                 
  23.                  
  24.                // 延時(shí)操作  
  25.                Thread.Sleep(1000);  
  26.                if (tcpClient != null)  
  27.                {  
  28.                    statusStripInfo.Invoke(showStatusCallBack, "連接成功");  
  29.                    networkStream = tcpClient.GetStream();  
  30.                    reader = new BinaryReader(networkStream);  
  31.                    writer =new BinaryWriter(networkStream);  
  32.                }                  
  33.            }  
  34.            catch 
  35.            {  
  36.                statusStripInfo.Invoke(showStatusCallBack,"連接失敗");  
  37.                Thread.Sleep(1000);  
  38.                statusStripInfo.Invoke(showStatusCallBack,"就緒");  
  39.            }  
  40.        } 

客戶端發(fā)送消息的代碼:

  1. // 發(fā)送消息  
  2.         private void btnSend_Click(object sender, EventArgs e)  
  3.         {  
  4.             Thread sendThread = new Thread(SendMessage);  
  5.             sendThread.Start(tbxMessage.Text);  
  6.         }  
  7.         private void SendMessage(object state)  
  8.         {  
  9.             statusStripInfo.Invoke(showStatusCallBack, "正在發(fā)送...");  
  10.             try 
  11.             {  
  12.                 writer.Write(state.ToString());  
  13.                 Thread.Sleep(5000);  
  14.                 writer.Flush();  
  15.                 statusStripInfo.Invoke(showStatusCallBack, "完畢");  
  16.  
  17.                 tbxMessage.Invoke(resetMessageCallBack, null);  
  18.                 lstbxMessageView.Invoke(showMessageCallback, state.ToString());  
  19.             }  
  20.             catch 
  21.             {  
  22.                 if (reader != null)  
  23.                 {  
  24.                     reader.Close();  
  25.                 }  
  26.                 if (writer != null)  
  27.                 {  
  28.                     writer.Close();  
  29.                 }  
  30.                 if (tcpClient != null)  
  31.                 {  
  32.                     tcpClient.Close();  
  33.                 }  
  34.                 statusStripInfo.Invoke(showStatusCallBack, "斷開(kāi)了連接");  
  35.             }  
  36.         } 

服務(wù)器端接受開(kāi)始監(jiān)聽(tīng)客戶端請(qǐng)求的代碼:

  1. // 開(kāi)始監(jiān)聽(tīng)  
  2.        private void btnStart_Click(object sender, EventArgs e)  
  3.        {  
  4.             
  5.            tcpLister = new TcpListener(ipaddress,Port);  
  6.            tcpLister.Start();  
  7.            // 啟動(dòng)一個(gè)線程來(lái)接受請(qǐng)求  
  8.            Thread acceptThread =new Thread(acceptClientConnect);  
  9.            acceptThread.Start();  
  10.        }  
  11.  
  12.        // 接受請(qǐng)求  
  13.        private void acceptClientConnect()  
  14.        {  
  15.            statusStripInfo.Invoke(showStatusCallBack,"正在監(jiān)聽(tīng)");  
  16.            Thread.Sleep(1000);  
  17.            try 
  18.            {  
  19.                statusStripInfo.Invoke(showStatusCallBack,"等待連接");  
  20.                tcpClient = tcpLister.AcceptTcpClient();  
  21.                if (tcpLister != null)  
  22.                {  
  23.                    statusStripInfo.Invoke(showStatusCallBack,"接受到連接");  
  24.                    networkStream = tcpClient.GetStream();  
  25.                    reader = new BinaryReader(networkStream);  
  26.                    writer = new BinaryWriter(networkStream);  
  27.                }  
  28.            }  
  29.            catch 
  30.            {  
  31.                statusStripInfo.Invoke(showStatusCallBack, "停止監(jiān)聽(tīng)");  
  32.                Thread.Sleep(1000);  
  33.                statusStripInfo.Invoke(showStatusCallBack, "就緒");  
  34.            }  
  35.        } 

現(xiàn)在看看運(yùn)行的結(jié)果:

首先先啟動(dòng)服務(wù)器然后點(diǎn)開(kāi)始監(jiān)聽(tīng),此時(shí)線程會(huì)堵塞,直到接受到一個(gè)連接請(qǐng)求位置

然后運(yùn)行客戶端,在IP地址和端口處輸入服務(wù)器端的IP地址和端口號(hào),點(diǎn)擊連接服務(wù)器按鈕后的界面如下:

通過(guò)接受按鈕和發(fā)送按鈕來(lái)實(shí)現(xiàn)雙方的通信,實(shí)現(xiàn)界面如下:

三、總結(jié)

到這里本專題的內(nèi)容將的差不多了, 本專題主要介紹了基于TCP協(xié)議工作過(guò)程和在net平臺(tái)下自定義了一個(gè)簡(jiǎn)單通信的程序,希望本專題可以給那些初次接觸TCP協(xié)議的朋友一些幫助,(大牛們應(yīng)該直接可以閃過(guò)的),在后面的專題我將和大家分享UDP編程,講完UDP編程后將結(jié)合這兩章的內(nèi)容實(shí)現(xiàn)一個(gè)類似QQ的即時(shí)聊天的工具,希望這些對(duì)大家有幫助,如果大家有任何問(wèn)題和有感興趣的專題需要了解的,可以給我留言,在之后的文章都會(huì)和大家來(lái)分享。

覺(jué)得看了后有幫助的朋友麻煩推薦下,也給我繼續(xù)下去的動(dòng)力,如果大家有什么感興趣的專題也可以留言告訴我,我會(huì)通過(guò)學(xué)習(xí)后也會(huì)相繼和大家分享。

下面是本程序源代碼:

http://files.cnblogs.com/zhili/%E7%AE%80%E5%8D%95%E9%80%9A%E4%BF%A1%E7%A8%8B%E5%BA%8F.zip

原文鏈接:http://www.cnblogs.com/zhili/archive/2012/08/25/TCP.html

【編輯推薦】

  1. C#網(wǎng)絡(luò)編程系列一:網(wǎng)絡(luò)協(xié)議簡(jiǎn)介
  2. C#網(wǎng)絡(luò)編程系列二:HTTP協(xié)議詳解
  3. C#網(wǎng)絡(luò)編程系列三:自定義Web服務(wù)器
  4. C#網(wǎng)絡(luò)編程系列四:自定義Web瀏覽器
  5. C#網(wǎng)絡(luò)編程系列六:UDP編程
  6. C#網(wǎng)絡(luò)編程系列七:UDP編程補(bǔ)充
  7. C#網(wǎng)絡(luò)編程系列八:P2P編程
  8. C#網(wǎng)絡(luò)編程系列九:類似QQ的即時(shí)通信程序
  9. C#網(wǎng)絡(luò)編程系列十:實(shí)現(xiàn)簡(jiǎn)單的郵件收發(fā)器

 

責(zé)任編輯:張偉 來(lái)源: Learning hard的博客
相關(guān)推薦

2012-09-24 15:35:24

C#網(wǎng)絡(luò)協(xié)議UDP

2012-09-25 11:28:38

C#網(wǎng)絡(luò)協(xié)議UDP

2012-09-24 14:03:58

C#網(wǎng)絡(luò)協(xié)議C

2012-09-25 13:47:43

C#網(wǎng)絡(luò)協(xié)議P2P

2009-08-21 14:47:39

C#網(wǎng)絡(luò)編程

2024-03-04 18:49:59

反射C#開(kāi)發(fā)

2012-09-24 14:09:31

C#網(wǎng)絡(luò)協(xié)議C

2015-04-24 09:48:59

TCPsocketsocket編程

2012-09-24 14:31:55

C#網(wǎng)絡(luò)協(xié)議C

2012-09-24 14:43:51

C#網(wǎng)絡(luò)協(xié)議C

2012-09-25 15:02:50

C#網(wǎng)絡(luò)協(xié)議

2009-08-21 14:03:04

C#網(wǎng)絡(luò)編程

2012-09-25 14:06:28

C#網(wǎng)絡(luò)協(xié)議

2019-09-18 20:07:06

AndroidTCP協(xié)議

2009-08-21 17:19:36

C#網(wǎng)絡(luò)編程入門

2009-08-26 10:34:15

C#類型C#變量

2009-08-24 11:02:52

C#接口映射

2009-08-24 09:55:26

C#接口轉(zhuǎn)換

2009-08-25 17:13:57

C#串口編程

2021-10-12 17:47:22

C# TAP異步
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)