C#网络编程主要依托.NET框架提供的System.Net和System.Net.Sockets命名空间实现,能够支持TCP、UDP等多种网络协议,满足不同场景下的数据传输需求。本文以最常用的TCP协议为例,讲解C#网络编程的基础实现方式。

C#网络编程核心基础
C#网络编程中最核心的类是Socket,它封装了底层网络操作的细节,开发者不需要直接处理复杂的网络协议栈逻辑。使用Socket进行通信前,需要先明确通信的协议类型、地址族和套接字类型,常见的TCP通信配置如下:
- 地址族:
AddressFamily.InterNetwork,对应IPv4协议 - 套接字类型:
SocketType.Stream,对应流式传输 - 协议类型:
ProtocolType.Tcp,对应TCP协议
TCP服务端实现
TCP服务端的核心流程是创建套接字、绑定端口、监听连接、接收客户端请求并处理数据,以下是同步模式的服务端实现代码:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace TcpServerDemo
{
class Program
{
static void Main(string[] args)
{
// 创建Socket实例
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 绑定IP和端口,这里使用本地回环地址和8888端口
IPEndPoint endPoint = new IPEndPoint(IPAddress.Loopback, 8888);
serverSocket.Bind(endPoint);
// 开始监听,设置最大挂起连接数为10
serverSocket.Listen(10);
Console.WriteLine("服务端已启动,等待客户端连接...");
// 接收客户端连接
Socket clientSocket = serverSocket.Accept();
Console.WriteLine("客户端已连接,地址:" + clientSocket.RemoteEndPoint);
// 接收客户端发送的数据
byte[] buffer = new byte[1024];
int length = clientSocket.Receive(buffer);
string receiveMsg = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("收到客户端消息:" + receiveMsg);
// 向客户端发送响应数据
string sendMsg = "服务端已收到你的消息:" + receiveMsg;
byte[] sendBuffer = Encoding.UTF8.GetBytes(sendMsg);
clientSocket.Send(sendBuffer);
// 关闭套接字
clientSocket.Close();
serverSocket.Close();
}
}
}
TCP客户端实现
TCP客户端的流程相对简单,创建套接字后直接连接服务端地址,之后就可以进行数据收发操作,代码如下:
using System;
using System.Net.Sockets;
using System.Text;
namespace TcpClientDemo
{
class Program
{
static void Main(string[] args)
{
// 创建Socket实例
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 连接服务端,地址和服务端绑定的地址保持一致
clientSocket.Connect("127.0.0.1", 8888);
Console.WriteLine("已连接到服务端");
// 向服务端发送数据
string sendMsg = "你好,我是客户端";
byte[] sendBuffer = Encoding.UTF8.GetBytes(sendMsg);
clientSocket.Send(sendBuffer);
// 接收服务端响应数据
byte[] buffer = new byte[1024];
int length = clientSocket.Receive(buffer);
string receiveMsg = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("收到服务端响应:" + receiveMsg);
// 关闭套接字
clientSocket.Close();
}
}
}
异步网络编程优化
上面的同步代码会阻塞当前线程,在实际开发中通常使用异步方法提升程序性能,C#提供了AcceptAsync、ReceiveAsync、SendAsync等异步方法,以下是异步接收数据的示例片段:
// 异步接收数据的示例方法
static async Task ReceiveDataAsync(Socket socket)
{
byte[] buffer = new byte[1024];
// 异步接收数据,不会阻塞线程
int length = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
string msg = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("异步收到消息:" + msg);
}
常见问题说明
在实际使用C#网络编程时,需要注意端口占用问题,如果启动服务端提示端口被占用,可以更换绑定的端口号。另外数据传输时需要注意编码统一,发送端和接收端都使用UTF8编码可以避免乱码问题。如果是跨机器通信,需要将服务端的绑定地址从回环地址改为本机实际IP地址,同时保证防火墙开放对应端口。