C#关于WebSocket的使用

因为主要做CS开发,所以之前没怎么涉及WebSocket的使用。前面有个项目,想着前端能不能直接跟我这边交互,所以研究了一下.NET的WebSocket的使用。

客户端连接

客户端的连接相对比较简单,可以直接使用ClientWebSocket即可。
示例代码:

using System.Net.WebSockets;
using System.Threading;
using System;
using System.Text;

using var cws = new ClientWebSocket();
// 设置每隔 5 秒发送一个 Ping 请求
cws.Options.KeepAliveInterval = TimeSpan.FromSeconds(5);

// 如果 1 秒内请求的服务端没有响应,则终止连接
cws.Options.KeepAliveTimeout = TimeSpan.FromSeconds(1);

Uri serverUri = new Uri("ws://echo.websocket.org");
var cancellationToken = new CancellationToken();

// 连接 WebSocket 服务器
await cws.ConnectAsync(serverUri, cancellationToken);
await cws.SendAsync(Encoding.Default.GetBytes( "Hello, World!"), WebSocketMessageType.Text,true, new CancellationToken());
var buffer = new byte[1024];
await cws.ReceiveAsync(buffer, new CancellationToken());
Console.WriteLine(Encoding.Default.GetString(buffer));
Console.ReadLine();

服务端的监听

服务端的监听需要用到HttpListenerWebSocketContext,相比TCP和HTTP的监听会稍微复杂一点点。但其实也还行。
示例代码:

using System;
using System.Net;
using System.Net.Http.Headers;
using System.Net.WebSockets;
using System.Text;
using System.Threading.Tasks;

public class SimpleWebSocketServer
{
    private HttpListener _listener;

    public async Task StartAsync(string url)
    {
        _listener = new HttpListener();
        _listener.Prefixes.Add(url);
        _listener.Start();

        Console.WriteLine($"Listening on {url}");

        while (true)
        {
            var context = await _listener.GetContextAsync();
            if (context.Request.IsWebSocketRequest)
            {
                ProcessWebSocketRequest(context);
            }
            else
            {
                // 处理非WebSocket请求
                HandleHttpRequest(context);
            }
        }
    }

    private void ProcessWebSocketRequest(HttpListenerContext context)
    {
        var webSocketContext = context.AcceptWebSocketAsync(null).Result;
        HandleWebSocketConnection(webSocketContext);
    }

    private async Task HandleWebSocketConnection(HttpListenerWebSocketContext webSocketContext)
    {
        var webSocket = webSocketContext.WebSocket;
        var buffer = new byte[1024];
        WebSocketReceiveResult result;

        do
        {
            result = await webSocket.ReceiveAsync(buffer, CancellationToken.None);

            // Echo the message back to the client
            await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
        } while (!result.CloseStatus.HasValue);

        webSocket.Dispose();
    }

    private void HandleHttpRequest(HttpListenerContext context)
    {
        // 处理普通的HTTP请求
        context.Response.StatusCode = 200;
        context.Response.Close();
    }
}
posted @   wzwyc  阅读(490)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示