C#创建WebSocket服务端

使用 C#创建 WebSocket 服务端的方法

1. 引入必要的命名空间

using System.Text; // 用于发送和接收信息时处理文本
using System.Net;   // 用于处理网络连接
using System.Net.WebSockets; // 用于处理WebSocket连接

2. 实例化 HttpListener


const string HOST = "localhost";     // 监听的主机名
const int PORT = 3030;              // 监听的端口号

HttpListener listener = new HttpListener(); // 实例化HttpListener,这个需要作为一个全局变量
listener.Prefixes.Add($"http://{HOST}:{PORT}/");  // 设置监听的URL
listener.Start(); // 开始监听

3. 处理客户端的请求

async static Task ListenClientConnections()
{
    while (true)
    {
        // 等待客户端的连接
        Console.WriteLine("等待客户端连接");
        HttpListenerContext context = await listener.GetContextAsync();
        // 判断此连接是否为WebSocket的请求
        if (context.Request.IsWebSocketRequest)
        {
            Console.WriteLine($"接收到客户端连接");
            // 这时候,我们可以用WebSocket来接受客户端的连接
            WebSocket webSocket = context.AcceptWebSocketAsync(null).Result.WebSocket;
            // 这时候我们可以根据需要来处理客户端的消息
            while (webSocket.State == WebSocketState.Open)
            {
                // 等待客户端的消息
                byte[] buffer = new byte[1024]; // 定义一个缓冲区大小为1KB
                ArraySegment<byte> segment = new ArraySegment<byte>(buffer);    // 定义一个数组段

                CancellationToken cancellationToken = CancellationToken.None;   // 定义一个取消标记

                // 这时候这里一直等待客户端的消息
                Console.WriteLine("等待客户端消息");
                WebSocketReceiveResult result = await webSocket.ReceiveAsync(segment, cancellationToken);

                // 文本类型的消息
                if (result.MessageType == WebSocketMessageType.Text)
                {
                    // 这里可以对客户端的消息进行处理
                    string message = Encoding.UTF8.GetString(buffer, 0, result.Count);

                    // 给客户端发送消息
                    string responseMessage = $"接收到客户端的消息: {message}";
                    Console.WriteLine(responseMessage);
                    byte[] responseBuffer = Encoding.UTF8.GetBytes(responseMessage);

                    await webSocket.SendAsync(
                        responseBuffer,     // 发送的消息,字节数组类型
                        WebSocketMessageType.Text,  // 消息类型为文本
                        true,   // 最后一帧,如果为false,则表示后面还有数据
                        CancellationToken.None    // 取消标记
                    );
                }
            }
            Console.WriteLine("客户端连接断开");
        }
    }
}

4. 启动服务端

ListenClientConnections().Wait(); // 启动监听客户端连接的异步方法

5. 客户端连接

在这里我们用 javascript 的 WebSocket 来模拟客户端的连接,并向服务端发送消息。

let ws = new WebSocket("ws://localhost:3030/");
ws.onopen = function () {
  console.log("连接到服务端");

  // 发送消息
  ws.send("Hello World!!!");
};

ws.onclose = function () {
  console.log("与服务端连接断开");
};

ws.onmessage = function ({ data }) {
  console.log("接收到服务端消息");
  console.log(data);

  // ws.send("Hello World!!!");  // 猜猜会发生什么?
  ws.close(); // 关闭连接
  console.log("关闭与服务端的连接");
};

ws.onerror = function () {
  console.log("WebSocket连接发生错误");
};

6. 运行结果

在服务端的控制台中,我们可以看到:

等待客户端连接
接收到客户端连接
等待客户端消息
接收到客户端的消息: Hello World!!!
等待客户端消息
客户端连接断开
等待客户端连接

在客户端的控制台中,我们可以看到:

连接到服务端
接收到服务端消息
接收到客户端的消息: Hello World!!!
关闭与服务端的连接
与服务端连接断开

到这里,我们就完成了 C# 创建 WebSocket 服务端的方法。

完整代码

using System.Text; // 用于发送和接收信息时处理文本
using System.Net;   // 用于处理网络连接
using System.Net.WebSockets; // 用于处理WebSocket连接

namespace Test.Program
{
    static class Program
    {
        static HttpListener listener;
        static void Main(string[] args)
        {
            const string HOST = "localhost";     // 监听的主机名
            const int PORT = 3030;              // 监听的端口号

            listener = new HttpListener(); // 实例化HttpListener
            listener.Prefixes.Add($"http://{HOST}:{PORT}/");  // 设置监听的URL
            listener.Start(); // 开始监听
            ListenClientConnections()
                .Wait();
        }

        async static Task ListenClientConnections()
        {
            while (true)
            {
                // 等待客户端的连接
                Console.WriteLine("等待客户端连接");
                HttpListenerContext context = await listener.GetContextAsync();
                // 判断此连接是否为WebSocket的请求
                if (context.Request.IsWebSocketRequest)
                {
                    Console.WriteLine($"接收到客户端连接");
                    // 这时候,我们可以用WebSocket来接受客户端的连接
                    WebSocket webSocket = context.AcceptWebSocketAsync(null).Result.WebSocket;
                    // 这时候我们可以根据需要来处理客户端的消息
                    while (webSocket.State == WebSocketState.Open)
                    {
                        // 等待客户端的消息
                        byte[] buffer = new byte[1024]; // 定义一个缓冲区大小为1KB
                        ArraySegment<byte> segment = new ArraySegment<byte>(buffer);    // 定义一个数组段

                        CancellationToken cancellationToken = CancellationToken.None;   // 定义一个取消标记

                        // 这时候这里一直等待客户端的消息
                        Console.WriteLine("等待客户端消息");
                        WebSocketReceiveResult result = await webSocket.ReceiveAsync(segment, cancellationToken);

                        // 文本类型的消息
                        if (result.MessageType == WebSocketMessageType.Text)
                        {
                            // 这里可以对客户端的消息进行处理
                            string message = Encoding.UTF8.GetString(buffer, 0, result.Count);

                            // 给客户端发送消息
                            string responseMessage = $"接收到客户端的消息: {message}";
                            Console.WriteLine(responseMessage);
                            byte[] responseBuffer = Encoding.UTF8.GetBytes(responseMessage);

                            await webSocket.SendAsync(
                                responseBuffer,     // 发送的消息,字节数组类型
                                WebSocketMessageType.Text,  // 消息类型为文本
                                true,   // 最后一帧,如果为false,则表示后面还有数据
                                CancellationToken.None    // 取消标记
                            );
                        }
                    }
                    Console.WriteLine("客户端连接断开");
                }
            }
        }
    }
}

客户端

let ws = new WebSocket("ws://localhost:3030/");
ws.onopen = function () {
  console.log("连接到服务端");

  // 发送消息
  ws.send("Hello World!!!");
};

ws.onclose = function () {
  console.log("与服务端连接断开");
};

ws.onmessage = function ({ data }) {
  console.log("接收到服务端消息");
  console.log(data);

  // ws.send("Hello World!!!");  // 猜猜会发生什么?
  ws.close(); // 关闭连接
  console.log("关闭与服务端的连接");
};

ws.onerror = function () {
  console.log("WebSocket连接发生错误");
};
posted @   慕色寒枝  阅读(416)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示