TCP 允許兩臺電腦通過網絡進行通信,是一種可靠的、面向連接的協議,它提供了內置的流控制、序列、錯誤處理。要創建一個TCP連接,必須有一臺電腦充當服務器,並且監聽一個具體的終結點(終結點是一個IP地址與端口號的組合)。另一臺電腦充當客戶端,發送連接請求到服務器正在監聽的終結點。一旦建立了連接,兩臺電腦輪流交換信息。.NET通過抽象的流(Stream)使得這個過程變得簡單了,兩臺電腦通過對System.Net.Sockets.NetworkStream的讀、寫操作來發送數據。
在設計網絡應用程序時,定義服務端和客戶端用於通信的協議,是一個比較不錯的想法。協議包括了一些所允許命令的常量,確保了應用程序代碼中不會包含硬編碼的通信字符串。這些常量編譯爲單獨的類庫程序集,必須被服務端和客戶端引用。
- public class SocketProtocol
- {
- public const string AcknowledgeOK = "確定連接";
- public const string AcknowledgeCancel = "取消連接";
- public const string Disconnect = "斷開連接";
- public const string RequestConnect = "請求連接";
- }
TCP 服務端的代碼:
- static void Main(string[] args)
- {
- //創建監聽器
- TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);
- Console.WriteLine("即將初始化端口");
- listener.Start();
- Console.WriteLine("監聽連接");
- try
- {
- //等待連接請求並返回TcpClient
- using (TcpClient client = listener.AcceptTcpClient())
- {
- Console.WriteLine("接受連接");
- //獲取網絡流
- NetworkStream stream = client.GetStream();
- //創建BinaryWriter寫入流
- using (BinaryWriter w = new BinaryWriter(stream))
- {
- //創建BinaryReader讀取流
- using (BinaryReader r = new BinaryReader(stream))
- {
- if (r.ReadString() == SocketProtocol.RequestConnect)
- {
- w.Write(SocketProtocol.AcknowledgeOK);
- Console.WriteLine("連接完成");
- while (r.ReadString() != SocketProtocol.Disconnect)
- {
- }
- Console.WriteLine(Environment.NewLine);
- Console.WriteLine("收到斷開連接請求");
- }
- else
- {
- Console.WriteLine("不能完成連接");
- }
- }
- }
- }
- Console.WriteLine("連接關閉");
- }
- catch(Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- finally
- {
- //關閉底層的Socket(停止監聽新的請求)
- listener.Stop();
- Console.WriteLine("監聽器停止");
- }
- Console.WriteLine(Environment.NewLine);
- Console.ReadLine();
- }
TCP客戶端的代碼:
- static void Main(string[] args)
- {
- TcpClient client = new TcpClient();
- try
- {
- Console.WriteLine("嘗試連接服務器");
- client.Connect(IPAddress.Parse("127.0.0.1"), 8000);
- Console.WriteLine("已建立連接");
- NetworkStream stream = client.GetStream();
- using (BinaryWriter w = new BinaryWriter(stream))
- {
- using (BinaryReader r = new BinaryReader(stream))
- {
- //開始對話
- w.Write(SocketProtocol.RequestConnect);
- if (r.ReadString() == SocketProtocol.AcknowledgeOK)
- {
- Console.WriteLine("已連接");
- Console.WriteLine("按下Enter鍵斷開連接");
- Console.ReadLine();
- Console.WriteLine("連接斷開...");
- w.Write(SocketProtocol.Disconnect);
- }
- else
- {
- Console.WriteLine("連接未完成");
- }
- }
- }
- }
- catch(Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- finally
- {
- //關閉連接Socket
- client.Close();
- Console.WriteLine("端口已關閉");
- }
- Console.WriteLine(Environment.NewLine);
- Console.ReadLine();
- }
本文鏈接地址爲:http://blog.csdn.net/fan_ken/article/details/6630046