编辑
2025-11-23
C#
00

目录

TCP/IP基础概念
TCP/IP协议栈的层次结构
TCP与UDP的对比
TCP三次握手和四次挥手
三次握手(建立连接)
四次挥手(关闭连接)
C#实现TCP通信
TCP服务器端实现
TCP客户端实现
异步TCP通信
常见TCP/IP通信问题
连接问题
性能问题
解决方法示例
总结

TCP/IP基础概念

TCP/IP(传输控制协议/互联网协议)是互联网的基础通信协议,它定义了数据如何在网络中传输的标准。作为现代网络的基石,理解TCP/IP对于开发高效、稳定的网络应用至关重要。

关键概念:

  • 协议(Protocol):网络通信的规则和约定
  • IP地址:网络设备的唯一标识
  • 端口(Port):应用程序的通信端点
  • 数据包(Packet):网络传输的基本单位

TCP/IP协议栈的层次结构

TCP/IP模型通常被分为四层,每一层负责不同的通信功能:

image.png

  1. 应用层:直接与应用程序交互(HTTP、FTP、SMTP等)
  2. 传输层:提供端到端的通信服务(TCP、UDP)
  3. 网络层:负责数据包的路由和转发(IP)
  4. 链路层:处理物理传输(以太网、WiFi等)

TCP与UDP的对比

特性TCPUDP
连接类型面向连接无连接
可靠性高(有确认、重传机制)低(无确认机制)
传输速度相对较慢
数据顺序保证顺序不保证顺序
适用场景文件传输、网页浏览视频流、游戏、DNS查询

TCP三次握手和四次挥手

三次握手(建立连接)

image.png

四次挥手(关闭连接)

image.png

C#实现TCP通信

TCP服务器端实现

C#
using System.Net.Sockets; using System.Net; using System.Text; namespace AppTCPServer { internal class Program { static void Main(string[] args) { // 设置IP地址和端口 IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); int port = 3000; // 创建TCP监听器 TcpListener server = new TcpListener(ipAddress, port); try { // 启动服务器 server.Start(); Console.WriteLine("服务器已启动,等待连接..."); while (true) { // 接受客户端连接 TcpClient client = server.AcceptTcpClient(); Console.WriteLine("客户端已连接!"); // 为每个客户端创建一个线程处理 Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClient)); clientThread.Start(client); } } catch (Exception ex) { Console.WriteLine($"服务器异常: {ex.Message}"); } finally { // 停止服务器 server.Stop(); } } static void HandleClient(object obj) { TcpClient client = (TcpClient)obj; NetworkStream stream = client.GetStream(); byte[] buffer = new byte[1024]; int bytesRead; try { // 持续读取客户端发送的数据 while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) { // 将接收到的数据转换为字符串 string data = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"收到: {data}"); // 响应客户端 string response = $"服务器收到: {data}"; byte[] responseData = Encoding.UTF8.GetBytes(response); stream.Write(responseData, 0, responseData.Length); Console.WriteLine($"发送: {response}"); } } catch (Exception ex) { Console.WriteLine($"处理客户端时发生异常: {ex.Message}"); } finally { // 关闭客户端连接 client.Close(); Console.WriteLine("客户端连接已关闭"); } } } }

TCP客户端实现

C#
using System.Net.Sockets; using System.Text; namespace AppTCPClient { internal class Program { static void Main(string[] args) { try { // 连接服务器的IP和端口 string serverIP = "127.0.0.1"; int port = 3000; // 创建TCP客户端并连接到服务器 TcpClient client = new TcpClient(); client.Connect(serverIP, port); Console.WriteLine("已连接到服务器!"); // 获取网络流 NetworkStream stream = client.GetStream(); // 循环发送消息 while (true) { Console.Write("请输入要发送的消息(输入'exit'退出): "); string message = Console.ReadLine(); if (message.ToLower() == "exit") break; // 将消息转换为字节数组并发送 byte[] data = Encoding.UTF8.GetBytes(message); stream.Write(data, 0, data.Length); Console.WriteLine("消息已发送"); // 接收服务器响应 byte[] buffer = new byte[1024]; int bytesRead = stream.Read(buffer, 0, buffer.Length); string response = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"服务器响应: {response}"); } // 关闭连接 client.Close(); Console.WriteLine("已断开与服务器的连接"); } catch (Exception ex) { Console.WriteLine($"客户端异常: {ex.Message}"); } Console.WriteLine("按任意键退出..."); Console.ReadKey(); } } }

image.png

异步TCP通信

在实际应用中,使用异步通信可以提高应用程序的响应性:

C#
using System.Net.Sockets; using System.Net; using System.Text; namespace AppAsyncTCP { internal class Program { static async Task Main(string[] args) { // 设置服务器参数 IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); int port = 3000; // 创建TCP监听器 TcpListener listener = new TcpListener(ipAddress, port); try { listener.Start(); Console.WriteLine("异步TCP服务器已启动,等待连接..."); while (true) { // 异步接受客户端连接 TcpClient client = await listener.AcceptTcpClientAsync(); Console.WriteLine("客户端已连接!"); // 异步处理客户端,不阻塞主线程 _ = HandleClientAsync(client); } } catch (Exception ex) { Console.WriteLine($"服务器异常: {ex.Message}"); } finally { listener.Stop(); } } static async Task HandleClientAsync(TcpClient client) { NetworkStream stream = client.GetStream(); byte[] buffer = new byte[1024]; try { int bytesRead; // 异步读取数据 while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0) { string data = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"异步收到: {data}"); // 异步响应客户端 string response = $"服务器异步收到: {data}"; byte[] responseData = Encoding.UTF8.GetBytes(response); await stream.WriteAsync(responseData, 0, responseData.Length); } } catch (Exception ex) { Console.WriteLine($"处理客户端时发生异常: {ex.Message}"); } finally { client.Close(); Console.WriteLine("客户端连接已关闭"); } } } }

常见TCP/IP通信问题

连接问题

  • 端口被占用:尝试使用其他端口或释放被占用的端口
  • 防火墙拦截:检查防火墙设置,允许应用程序网络访问
  • 网络不可达:检查网络连接、路由设置

性能问题

  • 缓冲区设置不当:根据数据量调整缓冲区大小
  • 同步阻塞操作:改用异步方法提高吞吐量
  • 频繁连接/断开:使用连接池或长连接

解决方法示例

C#
// 设置Socket选项改善性能 client.ReceiveBufferSize = 8192; // 增加接收缓冲区 client.SendBufferSize = 8192; // 增加发送缓冲区 client.NoDelay = true; // 禁用Nagle算法,减少延迟 // 设置超时 client.SendTimeout = 5000; // 5秒发送超时 client.ReceiveTimeout = 5000; // 5秒接收超时

总结

TCP/IP通信是现代网络应用的基础,理解其工作原理对于开发可靠的网络应用至关重要。通过C#提供的网络类库,我们可以轻松实现各种网络通信模式。

本文介绍了TCP/IP的基本概念、协议栈结构、TCP与UDP的区别,并通过详细的C#代码示例展示了如何实现TCP服务器和客户端。此外,我们还讨论了异步通信方法和常见问题的解决方案。

希望这篇文章能够帮助你深入理解TCP/IP通信原理,并在实际开发中应用这些知识构建高效、稳定的网络应用。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!