TCP 通信

本文介绍了如何使用.NET Framework中的System.Net.Sockets命名空间创建TCP服务器和客户端,通过TcpListener和TcpClient进行连接,使用NetworkStream进行数据交互。重点讨论了如何定义SocketProtocol类来标准化服务端和客户端之间的通信协议,确保了应用程序代码的可维护性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   服务端使用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.youkuaiyun.com/fan_ken/article/details/6630046

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值