日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#網(wǎng)絡(luò)通信:TCP連接

基本原理:TCP連接的特點(diǎn)是連接一直存在,即建立連接后可以隨時(shí)傳輸數(shù)據(jù),直至斷開連接為止。TCP連接有著明確的服務(wù)器和客戶端的分工,因此需要分別編程處理。

網(wǎng)絡(luò)通信用到的命名空間:

 
 
 
  1. using System.Net;  
  2. using System.Net.Sockets; 

C#網(wǎng)絡(luò)通信:TCP連接第一步——獲取服務(wù)器的IP地址

當(dāng)然您可以通過ipconfig等方式查詢作為服務(wù)器的計(jì)算機(jī)的IP地址,這里介紹通過C#語句獲取的方法。

 
 
 
  1. private String GetIPAddress()  
  2.  {  
  3.      String str;  
  4.      String Result = "";  
  5.      String hostName = Dns.GetHostName();  
  6.      IPAddress[] myIP = Dns.GetHostAddresses(hostName);  
  7.      foreach (IPAddress address in myIP)  
  8.      {  
  9.          str = address.ToString();  
  10.          for (int i = 0; i <  str.Length; i++)  
  11.          {  
  12.              if (str[i] >= '0' && str[i] < = '9' || str[i] == '.') Result = str;  
  13.          }  
  14.      }  
  15.      return Result;  
  16.  } 

紅色的部分是核心的語句,獲取的是一組IP地址,存儲(chǔ)在 IPAddress[] myIP 中。這組IP地址包含物理(依次輸出下就會(huì)發(fā)現(xiàn)),但我們最常用的是32位的IP地址,因此編寫了這個(gè)方法進(jìn)行篩選。

C#網(wǎng)絡(luò)通信:TCP連接第二步——服務(wù)器建立監(jiān)聽

 
 
 
  1. IPAddress ipa = IPAddress.Parse("192.168.1.100");  
  2.  
  3. TcpListener myListener = new TcpListener(ipa, 8080);  
  4.  
  5. myListener.Start(); 

紅色的部分是服務(wù)器的IP地址和要開放的端口號(hào),視具體情況而定。端口號(hào)為整型。

C#網(wǎng)絡(luò)通信:TCP連接第三步——客戶端請(qǐng)求連接

 
 
 
  1. TcpClient tclient = new TcpClient();  
  2.  
  3. tclient.Connect("192.168.1.100", 8080); 

如果客戶端請(qǐng)求連接時(shí)服務(wù)器并未開啟監(jiān)聽,則會(huì)拋出 SocketException 異常。所以一是要確保服務(wù)器開啟監(jiān)聽了再請(qǐng)求連接,二是應(yīng)該把這兩行代碼放入到try-catch里面,以便連接不成功時(shí)程序不會(huì)崩潰。

C#網(wǎng)絡(luò)通信:TCP連接第四步——服務(wù)器應(yīng)答

 
 
 
  1. Socket mySocket = myListener.AcceptSocket(); 

服務(wù)器將連接綁定給mySocket,以后和客戶端的通信都通過mySocket來完成。

但這里需要注意,如果執(zhí)行該語句時(shí)沒有客戶端請(qǐng)求連接,則會(huì)進(jìn)入無盡的等待,使程序出現(xiàn)“未響應(yīng)”的狀態(tài)。因此Socket的下面這個(gè)方法將極為有用:

 
 
 
  1. if (myListener.Pending())  
  2. {  
  3.        Socket mySocket = myListener.AcceptSocket();  
  4.   } 

Pending()的作用是“確定是否有掛起的連接請(qǐng)求”,如果有則返回true。這樣以來就實(shí)現(xiàn)了有請(qǐng)求時(shí)才去接受,再配合WinForm的Timer組件使用,可以達(dá)到很好的效果。

至此,連接工作已完成??偨Y(jié)一下,只有第三步是客戶端的代碼,其余都是服務(wù)器的代碼。

C#網(wǎng)絡(luò)通信:TCP連接第五步——發(fā)送數(shù)據(jù)和接收數(shù)據(jù)

1.服務(wù)器發(fā)送:

 
 
 
  1. mySocket.Send(Encoding.Unicode.GetBytes("要發(fā)送的內(nèi)容")); 

2.服務(wù)器接收:

 
 
 
  1. byte[] data = new byte[1024];  
  2.  if (mySocket.Available > 0)  
  3. {  
  4. mySocket.Receive(data);  
  5. String content = Encoding.Unicode.GetString(data);  

3.客戶端發(fā)送:

 
 
 
  1. NetworkStream ns = tclient.GetStream();  
  2.  
  3. String content = "要發(fā)送的內(nèi)容";  
  4.  
  5. byte[] data = Encoding.Unicode.GetBytes(content);  
  6.  
  7.  ns.Write(data, 0, data.Length); 

4.客戶端接受:

 
 
 
  1. if (tclient.Available > 0)  
  2. {  
  3. byte[] data = new byte[1024];  
  4. ns.Read(data, 0, 1024);  
  5. String content = Encoding.Unicode.GetString(data);  

服務(wù)器使用Send和Receive方法,客戶端使用NetworkStream流。其中 mySocket.Available > 0 和 tclient.Available > 0 的作用與 myListener.Pending() 的作用相同,都是先判斷是否有數(shù)據(jù)可讀再進(jìn)行讀取,否則也會(huì)失去響應(yīng)。Encoding.Unicode的方法用于字符串和字節(jié)數(shù)組間的轉(zhuǎn)換,因?yàn)榫W(wǎng)絡(luò)中的數(shù)據(jù)是以字節(jié)傳輸?shù)?。接收?shù)據(jù)時(shí)也可以使用Timer來達(dá)到更好的效果。

【編輯推薦】

  1. C#控制臺(tái)應(yīng)用程序的基本結(jié)構(gòu)
  2. C#編程:使用迭代器
  3. 淺談C#泛型的定義、繼承、方法和約束
  4. C++和C#相互調(diào)用COM組件的方法簡介
  5. 如何實(shí)現(xiàn)C#代理(Delegate)

本文名稱:C#網(wǎng)絡(luò)通信:TCP連接
網(wǎng)站鏈接:http://www.5511xx.com/article/ccehcgp.html