WebSocket 是一种网络通信协议,提供了浏览器和服务器之间的全双工通信渠道。与传统的 HTTP 请求相比,WebSocket 允许服务器主动发送信息给客户端,实现真正的实时双向交互。在 C# 中,我们可以使用 .NET Framework 或 .NET Core 来实现 WebSocket 通信。本文将深入探讨在 C# 中如何使用 WebSocket 进行开发。
一、WebSocket 基础
WebSocket 协议通过单个长连接实现客户端与服务器之间的全双工通讯。这意味着客户端和服务器之间的数据交换可以随时发起,非常适合需要高频更新的应用程序,如在线游戏、聊天应用、实时通知等。
二、在 C# 中实现 WebSocket 服务器
在 .NET Core 中,我们可以使用 System.Net.WebSockets
命名空间来创建一个 WebSocket 服务器。以下是一个简单的 WebSocket 服务器实现:
using System;
using System.Net;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
public class WebSocketServer
{
private const int Port = 8080;
public static async Task Main(string[] args)
{
var httpListener = new HttpListener();
httpListener.Prefixes.Add($"http://*:{Port}/");
httpListener.Start();
Console.WriteLine("WebSocket 服务器启动,监听端口:" + Port);
while (true)
{
var context = await httpListener.GetContextAsync();
if (context.Request.IsWebSocketRequest)
{
ProcessRequest(context);
}
else
{
context.Response.StatusCode = 400;
context.Response.Close();
}
}
}
private static async void ProcessRequest(HttpListenerContext context)
{
WebSocketContext wsContext;
try
{
wsContext = await context.AcceptWebSocketAsync(subProtocol: null);
}
catch (Exception ex)
{
context.Response.StatusCode = 500;
context.Response.Close();
Console.WriteLine($"无法建立 WebSocket 连接:{ex}");
return;
}
WebSocket webSocket = wsContext.WebSocket;
try
{
byte[] buffer = new byte[1024];
while (webSocket.State == WebSocketState.Open)
{
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Text)
{
Console.WriteLine($"收到消息:{System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count)}");
await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), WebSocketMessageType.Text, true, CancellationToken.None);
}
else if (result.MessageType == WebSocketMessageType.Close)
{
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
}
}
}
catch (Exception ex)
{
if (webSocket.State == WebSocketState.Open)
{
await webSocket.CloseAsync(WebSocketCloseStatus.InternalServerError, "内部服务器错误", CancellationToken.None);
}
Console.WriteLine($"WebSocket 连接异常:{ex}");
}
}
}
三、在 C# 中实现 WebSocket 客户端
同样,在 C# 中创建一个 WebSocket 客户端也非常简单。以下是一个简单的 WebSocket 客户端示例:
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
public class WebSocketClient
{
private const string Uri = "ws://localhost:8080/";
public static async Task Main(string[] args)
{
using (var ws = new ClientWebSocket())
{
await ws.ConnectAsync(new Uri(Uri), CancellationToken.None);
Console.WriteLine("WebSocket 客户端已连接");
string message = "Hello, WebSocket!";
byte[] buffer = Encoding.UTF8.GetBytes(message);
await ws.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
Console.WriteLine("发送消息:" + message);
buffer = new byte[1024];
var result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
Console.WriteLine($"收到消息:{Encoding.UTF8.GetString(buffer, 0, result.Count)}");
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
}
}
}
四、WebSocket 的应用场景
WebSocket 适用于需要实时数据交互的应用场景,如:
在线游戏:玩家之间的实时交互。
聊天应用:实时消息传递。
金融交易:实时股票价格更新。
实时通知:如新闻更新、社交媒体动态等。
五、总结
WebSocket 提供了一种在客户端和服务器之间进行全双工通信的有效方式。在 C# 中,我们可以使用 .NET Core 或 .NET Framework 轻松地实现 WebSocket 服务器和客户端。WebSocket 的应用场景广泛,特别适用于需要实时数据交互的应用程序。