基于C#的Socket通信TCP和UDP两种协议实现
2025-12-15
基于C#实现的Socket通信完整示例源码,包含TCP和UDP两种协议实现
一、TCP通信示例
1. TCP服务端(同步版)
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class TcpServer
{
private Socket _serverSocket;
private Socket _clientSocket;
private byte[] _buffer = new byte[1024];
public void Start(string ipAddress, int port)
{
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_serverSocket.Bind(new IPEndPoint(IPAddress.Parse(ipAddress), port));
_serverSocket.Listen(10);
Console.WriteLine($"服务器启动,监听 {ipAddress}:{port}");
_clientSocket = _serverSocket.Accept();
Console.WriteLine("客户端已连接");
// 接收数据线程
Thread receiveThread = new Thread(ReceiveData);
receiveThread.Start();
}
private void ReceiveData()
{
try
{
while (true)
{
int bytesReceived = _clientSocket.Receive(_buffer);
string message = Encoding.UTF8.GetString(_buffer, 0, bytesReceived);
Console.WriteLine($"收到消息: {message}");
// 回显消息
byte[] response = Encoding.UTF8.GetBytes($"ECHO: {message}");
_clientSocket.Send(response);
}
}
catch (SocketException ex)
{
Console.WriteLine($"Socket异常: {ex.Message}");
}
}
public void Stop()
{
_clientSocket.Shutdown(SocketShutdown.Both);
_clientSocket.Close();
_serverSocket.Close();
}
}
2. TCP客户端(同步版)
using System;
using System.Net.Sockets;
using System.Text;
public class TcpClientDemo
{
private Socket _clientSocket;
private byte[] _buffer = new byte[1024];
public void Connect(string serverIp, int port)
{
_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_clientSocket.Connect(new IPEndPoint(IPAddress.Parse(serverIp), port));
Console.WriteLine("已连接到服务器");
}
public void SendMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
_clientSocket.Send(data);
// 接收回显
int bytesReceived = _clientSocket.Receive(_buffer);
string response = Encoding.UTF8.GetString(_buffer, 0, bytesReceived);
Console.WriteLine($"服务器响应: {response}");
}
public void Disconnect()
{
_clientSocket.Shutdown(SocketShutdown.Both);
_clientSocket.Close();
}
}
二、UDP通信示例
1. UDP服务端
using System;
using System.Net;
using System.Net.Sockets;
public class UdpServer
{
private UdpClient _udpServer;
public void Start(int port)
{
_udpServer = new UdpClient(port);
Console.WriteLine($"UDP服务器启动,监听端口 {port}");
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
byte[] receiveBytes = _udpServer.Receive(ref remoteEP);
string message = Encoding.UTF8.GetString(receiveBytes);
Console.WriteLine($"收到来自 {remoteEP} 的消息: {message}");
// 回显消息
byte[] response = Encoding.UTF8.GetBytes($"ECHO: {message}");
_udpServer.Send(response, response.Length, remoteEP);
}
public void Stop()
{
_udpServer.Close();
}
}
2. UDP客户端
using System;
using System.Net;
using System.Net.Sockets;
public class UdpClientDemo
{
private UdpClient _udpClient;
public void Send(string serverIp, int port, string message)
{
_udpClient = new UdpClient();
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(serverIp), port);
byte[] data = Encoding.UTF8.GetBytes(message);
_udpClient.Send(data, data.Length, remoteEP);
// 接收回显
IPEndPoint receiveEP = new IPEndPoint(IPAddress.Any, 0);
byte[] receiveBytes = _udpClient.Receive(ref receiveEP);
string response = Encoding.UTF8.GetString(receiveBytes);
Console.WriteLine($"服务器响应: {response}");
_udpClient.Close();
}
}
三、使用示例
1. TCP通信测试
// 服务端启动
var tcpServer = new TcpServer();
tcpServer.Start("127.0.0.1", 8888);
// 客户端连接
var tcpClient = new TcpClientDemo();
tcpClient.Connect("127.0.0.1", 8888);
tcpClient.SendMessage("Hello Server!");
tcpClient.Disconnect();
2. UDP通信测试
// 服务端启动
var udpServer = new UdpServer();
udpServer.Start(9999);
// 客户端发送
var udpClient = new UdpClientDemo();
udpClient.Send("127.0.0.1", 9999, "Hello UDP Server!");
udpServer.Stop();
四、关键功能说明
-
TCP协议特性 面向连接,保证数据可靠性 支持双向持续通信 需要处理粘包/分包问题(示例未实现)
-
UDP协议特性 无连接,不保证可靠性 低延迟,适合实时通信 需自行处理数据完整性
-
异常处理建议
try { // 网络操作 } catch (SocketException ex) { Console.WriteLine($"Socket错误: {ex.SocketErrorCode} - {ex.Message}"); } catch (ObjectDisposedException) { Console.WriteLine("套接字已关闭"); }
五、工程实践建议
-
多线程处理
// 使用异步方法提升性能 public async Task ReceiveAsync() { while (true) { SocketAsyncEventArgs e = new SocketAsyncEventArgs(); e.SetBuffer(_buffer, 0, _buffer.Length); e.Completed += OnReceiveCompleted; await _clientSocket.ReceiveAsync(e); } } -
心跳机制
// 定时发送心跳包 Timer heartbeatTimer = new Timer(30000); heartbeatTimer.Elapsed += (s, e) => { byte[] heartbeat = Encoding.UTF8.GetBytes("HEARTBEAT"); _clientSocket.Send(heartbeat); }; -
消息边界处理
// 使用固定长度头部 public void SendWithHeader(string message) { byte[] data = Encoding.UTF8.GetBytes(message); byte[] header = BitConverter.GetBytes(data.Length); _clientSocket.Send(header.Concat(data).ToArray()); }
六、调试技巧
-
数据监控
// 使用Wireshark抓包分析 // 或添加日志记录 public static class Logger { public static void Log(byte[] data) { File.WriteAllBytes("debug.bin", data); } } -
性能测试
// 压力测试代码 for (int i = 0; i < 1000; i++) { var client = new TcpClientDemo(); client.Connect("127.0.0.1", 8888); client.SendMessage($"Test {i}"); client.Disconnect(); }
参考代码 C# Socket通信示例源码 www.youwenfan.com/contenttef/93545.html
七、扩展功能实现
-
SSL加密通信
using System.Net.Security; using System.Security.Authentication; public class SecureTcpServer { private SslStream _sslStream; public void StartSecure(int port) { // 加载证书 X509Certificate2 serverCert = new X509Certificate2("server.pfx", "password"); TcpListener listener = new TcpListener(IPAddress.Any, port); listener.Start(); TcpClient client = listener.AcceptTcpClient(); _sslStream = new SslStream(client.GetStream(), false); _sslStream.AuthenticateAsServer(serverCert); } } -
协议扩展
public enum MessageType : byte { Text = 0x01, File = 0x02, Command = 0x03 } public class ProtocolParser { public static (MessageType type, string content) Parse(byte[] data) { MessageType type = (MessageType)data[0]; string content = Encoding.UTF8.GetString(data.Skip(1).ToArray()); return (type, content); } }
