TCP 通信

   服務端使用System.Net.Sockets.TcpListener進行監聽,客戶端使用System.Net.Sockets.TcpClient進行連接。一旦連接建立,兩者使用System.Net.Sockets.NetworkStream進行通信。

        TCP 允許兩臺電腦通過網絡進行通信,是一種可靠的、面向連接的協議,它提供了內置的流控制、序列、錯誤處理。要創建一個TCP連接,必須有一臺電腦充當服務器,並且監聽一個具體的終結點(終結點是一個IP地址與端口號的組合)。另一臺電腦充當客戶端,發送連接請求到服務器正在監聽的終結點。一旦建立了連接,兩臺電腦輪流交換信息。.NET通過抽象的流(Stream)使得這個過程變得簡單了,兩臺電腦通過對System.Net.Sockets.NetworkStream的讀、寫操作來發送數據。

        在設計網絡應用程序時,定義服務端和客戶端用於通信的協議,是一個比較不錯的想法。協議包括了一些所允許命令的常量,確保了應用程序代碼中不會包含硬編碼的通信字符串。這些常量編譯爲單獨的類庫程序集,必須被服務端和客戶端引用。

  1. public class SocketProtocol  
  2. {  
  3.     public const string AcknowledgeOK = "確定連接";  
  4.     public const string AcknowledgeCancel = "取消連接";  
  5.     public const string Disconnect = "斷開連接";  
  6.     public const string RequestConnect = "請求連接";  
  7. }  

TCP 服務端的代碼:

  1. static void Main(string[] args)  
  2. {  
  3.     //創建監聽器   
  4.     TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);  
  5.     Console.WriteLine("即將初始化端口");  
  6.     listener.Start();  
  7.     Console.WriteLine("監聽連接");  
  8.   
  9.     try  
  10.     {  
  11.         //等待連接請求並返回TcpClient   
  12.         using (TcpClient client = listener.AcceptTcpClient())  
  13.         {  
  14.             Console.WriteLine("接受連接");  
  15.             //獲取網絡流   
  16.             NetworkStream stream = client.GetStream();  
  17.             //創建BinaryWriter寫入流   
  18.             using (BinaryWriter w = new BinaryWriter(stream))  
  19.             {  
  20.                 //創建BinaryReader讀取流   
  21.                 using (BinaryReader r = new BinaryReader(stream))  
  22.                 {  
  23.                     if (r.ReadString() == SocketProtocol.RequestConnect)  
  24.                     {  
  25.                         w.Write(SocketProtocol.AcknowledgeOK);  
  26.                         Console.WriteLine("連接完成");  
  27.   
  28.                         while (r.ReadString() != SocketProtocol.Disconnect)  
  29.                         {  
  30.   
  31.                         }  
  32.                         Console.WriteLine(Environment.NewLine);  
  33.                         Console.WriteLine("收到斷開連接請求");  
  34.                     }  
  35.                     else  
  36.                     {  
  37.                         Console.WriteLine("不能完成連接");  
  38.                     }  
  39.                 }  
  40.             }  
  41.         }  
  42.         Console.WriteLine("連接關閉");  
  43.     }  
  44.     catch(Exception ex)  
  45.     {  
  46.         Console.WriteLine(ex.Message);  
  47.     }  
  48.     finally  
  49.     {  
  50.         //關閉底層的Socket(停止監聽新的請求)   
  51.         listener.Stop();  
  52.         Console.WriteLine("監聽器停止");  
  53.     }  
  54.   
  55.     Console.WriteLine(Environment.NewLine);  
  56.     Console.ReadLine();  
  57. }  

TCP客戶端的代碼:

  1. static void Main(string[] args)  
  2. {  
  3.     TcpClient client = new TcpClient();  
  4.   
  5.     try  
  6.     {  
  7.         Console.WriteLine("嘗試連接服務器");  
  8.         client.Connect(IPAddress.Parse("127.0.0.1"), 8000);  
  9.         Console.WriteLine("已建立連接");  
  10.   
  11.         NetworkStream stream = client.GetStream();  
  12.         using (BinaryWriter w = new BinaryWriter(stream))  
  13.         {  
  14.             using (BinaryReader r = new BinaryReader(stream))  
  15.             {  
  16.                 //開始對話   
  17.                 w.Write(SocketProtocol.RequestConnect);  
  18.   
  19.                 if (r.ReadString() == SocketProtocol.AcknowledgeOK)  
  20.                 {  
  21.                     Console.WriteLine("已連接");  
  22.                     Console.WriteLine("按下Enter鍵斷開連接");  
  23.                     Console.ReadLine();  
  24.                     Console.WriteLine("連接斷開...");  
  25.                     w.Write(SocketProtocol.Disconnect);  
  26.                 }  
  27.                 else  
  28.                 {  
  29.                     Console.WriteLine("連接未完成");  
  30.                 }  
  31.             }  
  32.         }  
  33.     }  
  34.     catch(Exception ex)  
  35.     {  
  36.         Console.WriteLine(ex.Message);  
  37.     }  
  38.     finally  
  39.     {  
  40.         //關閉連接Socket   
  41.         client.Close();  
  42.         Console.WriteLine("端口已關閉");  
  43.     }  
  44.     Console.WriteLine(Environment.NewLine);  
  45.     Console.ReadLine();  
  46. }  



本文鏈接地址爲:http://blog.csdn.net/fan_ken/article/details/6630046

發佈了66 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章