如何在 C# WinFrom 应用中启动一个 WebSocket 服务?

在 C# WinForms 应用程序中启动 WebSocket 服务,你可以使用 System.Net.WebSockets 命名空间提供的类来实现。以下是一个简单的示例代码,演示了如何在 C# WinForms 应用程序中启动 WebSocket 服务:

using System;
using System.Net;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace YourNamespace
{
    public partial class MainForm : Form
    {
        private HttpListener listener;
        private CancellationTokenSource cancellationTokenSource;

        public MainForm()
        {
            InitializeComponent();
        }

        private async void MainForm_Load(object sender, EventArgs e)
        {
            // 设置监听地址和端口
            string url = "http://localhost:8888/";

            // 创建并启动 HttpListener 实例
            listener = new HttpListener();
            listener.Prefixes.Add(url);
            listener.Start();

            // 接收客户端连接并处理请求
            cancellationTokenSource = new CancellationTokenSource();
            await AcceptWebSocketClientsAsync();

            textBox1.AppendText("WebSocket 服务已启动!\n");
        }

        private async Task AcceptWebSocketClientsAsync()
        {
            while (true)
            {
                try
                {
                    // 等待客户端连接请求
                    HttpListenerContext context = await listener.GetContextAsync();

                    // 检查是否是 WebSocket 连接请求
                    if (context.Request.IsWebSocketRequest)
                    {
                        HttpListenerWebSocketContext webSocketContext = await context.AcceptWebSocketAsync(null);

                        // 处理 WebSocket 连接
                        HandleWebSocketConnection(webSocketContext.WebSocket);
                    }
                    else
                    {
                        context.Response.StatusCode = 400;
                        context.Response.Close();
                    }
                }
                catch (Exception ex)
                {
                    // 处理异常情况
                    textBox1.AppendText("发生错误:" + ex.Message + "\n");
                }
            }
        }

        private void HandleWebSocketConnection(WebSocket webSocket)
        {
            // 在这里可以编写自定义的 WebSocket 连接处理逻辑
            // 比如接收和发送消息等

            // 示例:接收并处理客户端发送的消息
            Task.Run(async () =>
            {
                byte[] buffer = new byte[1024];

                while (webSocket.State == WebSocketState.Open)
                {
                    WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
                    string message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);

                    // 在此处可以处理收到的消息

                    // 示例:回复客户端消息
                    byte[] responseBuffer = System.Text.Encoding.UTF8.GetBytes("收到消息:" + message);
                    await webSocket.SendAsync(new ArraySegment<byte>(responseBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
                }
            });
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 停止服务并释放资源
            listener.Stop();
            cancellationTokenSource.Cancel();
        }
    }
}
  

上述示例代码在 WinForms 主窗体中启动了一个监听指定地址和端口的 HttpListener,并在其中通过异步方式接收 WebSocket 连接请求。在接收到连接后,可以在 HandleWebSocketConnection 方法中编写自定义的 WebSocket 连接处理逻辑。当窗体关闭时,停止服务并释放资源。

请根据你的实际需求和网络配置,修改示例代码中的 URL 地址和端口号,并根据需要处理接收和发送的消息。

请注意,为了运行此示例,可能需要在项目的引用中添加 System.Net.WebSockets 程序集,并确保你的应用程序具有监听指定地址和端口的权限。