在C#中可以通过System.Net.WebSockets命名空间提供的类来实现WebSocket通信,该命名空间包含了服务端和客户端所需的全部核心类型,无需依赖第三方库即可完成基础功能开发。

WebSocket服务端实现
服务端基于HttpListener监听请求,当接收到WebSocket请求时升级连接,之后就可以进行双向消息传输。以下是完整的服务端实现代码:
using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace WebSocketServerDemo
{
class Program
{
static async Task Main(string[] args)
{
// 创建HttpListener监听本地8080端口
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/");
listener.Start();
Console.WriteLine("WebSocket服务端已启动,监听地址:http://localhost:8080/");
while (true)
{
// 等待客户端连接请求
HttpListenerContext context = await listener.GetContextAsync();
// 判断是否为WebSocket请求
if (context.Request.IsWebSocketRequest)
{
// 处理WebSocket连接
Task.Run(() => ProcessWebSocketAsync(context));
}
else
{
context.Response.StatusCode = 400;
context.Response.Close();
}
}
}
static async Task ProcessWebSocketAsync(HttpListenerContext context)
{
WebSocketContext webSocketContext = null;
try
{
// 接受WebSocket连接
webSocketContext = await context.AcceptWebSocketAsync(null);
WebSocket webSocket = webSocketContext.WebSocket;
Console.WriteLine("客户端已连接");
byte[] buffer = new byte[1024];
// 循环接收客户端消息
while (webSocket.State == WebSocketState.Open)
{
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
// 如果客户端关闭连接
if (result.MessageType == WebSocketMessageType.Close)
{
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "连接关闭", CancellationToken.None);
Console.WriteLine("客户端已断开连接");
break;
}
// 处理接收到的文本消息
string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine($"收到客户端消息:{receivedMessage}");
// 向客户端发送响应消息
string responseMessage = $"服务端已收到消息:{receivedMessage}";
byte[] responseBuffer = Encoding.UTF8.GetBytes(responseMessage);
await webSocket.SendAsync(new ArraySegment<byte>(responseBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
}
}
catch (Exception ex)
{
Console.WriteLine($"服务端处理异常:{ex.Message}");
}
finally
{
webSocketContext?.WebSocket?.Dispose();
}
}
}
}
WebSocket客户端实现
客户端使用ClientWebSocket类发起连接,连接建立后可以主动发送消息并接收服务端的响应。以下是客户端实现代码:
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace WebSocketClientDemo
{
class Program
{
static async Task Main(string[] args)
{
using (ClientWebSocket client = new ClientWebSocket())
{
// 连接服务端地址
Uri serverUri = new Uri("ws://localhost:8080/");
await client.ConnectAsync(serverUri, CancellationToken.None);
Console.WriteLine("已连接到WebSocket服务端");
// 启动接收消息的任务
Task receiveTask = Task.Run(() => ReceiveMessageAsync(client));
// 循环发送消息
while (client.State == WebSocketState.Open)
{
Console.Write("请输入要发送的消息(输入exit退出):");
string input = Console.ReadLine();
if (input == "exit")
{
await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "客户端主动关闭", CancellationToken.None);
break;
}
byte[] sendBuffer = Encoding.UTF8.GetBytes(input);
await client.SendAsync(new ArraySegment<byte>(sendBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
}
await receiveTask;
}
}
static async Task ReceiveMessageAsync(ClientWebSocket client)
{
byte[] buffer = new byte[1024];
try
{
while (client.State == WebSocketState.Open)
{
WebSocketReceiveResult result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close)
{
await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "连接关闭", CancellationToken.None);
Console.WriteLine("服务端已关闭连接");
break;
}
string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine($"收到服务端响应:{message}");
}
}
catch (Exception ex)
{
Console.WriteLine($"接收消息异常:{ex.Message}");
}
}
}
}
核心注意事项
- 服务端需要以管理员权限运行,否则可能无法绑定指定端口
- WebSocket连接地址前缀,服务端是http,客户端连接时使用ws,如果是HTTPS则对应wss
- 收发消息时需要正确处理
ArraySegment<byte>的偏移和长度,避免读取到无效数据 - 实际应用中需要添加更完善的异常处理和重连机制,避免网络波动导致连接中断
功能扩展建议
上述代码是基础实现,实际开发中可以根据需求扩展功能,比如添加消息类型区分、二进制数据传输、多客户端连接管理、心跳检测机制等。如果需要更丰富的功能,也可以考虑使用第三方库如WebSocketSharp,但原生实现已经能满足大部分基础实时通信场景的需求。
C#WebSocket服务端客户端WebSockets修改时间:2026-07-14 11:30:27