TCP/IP(传输控制协议/互联网协议)是互联网的基础通信协议,它定义了数据如何在网络中传输的标准。作为现代网络的基石,理解TCP/IP对于开发高效、稳定的网络应用至关重要。
关键概念:
TCP/IP模型通常被分为四层,每一层负责不同的通信功能:

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


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("客户端连接已关闭");
}
}
}
}
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();
}
}
}

在实际应用中,使用异步通信可以提高应用程序的响应性:
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("客户端连接已关闭");
}
}
}
}
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 许可协议。转载请注明出处!