winform WebSockets连接服务端

using System;

using System.Net.WebSockets;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace MakeAppointment

{

public partial class Form2 : Form

{

private ClientWebSocket _clientWebSocket;

private CancellationTokenSource _cancellationTokenSource;

复制代码
    public Form2()
    {
        InitializeComponent();

        this.FormClosing += WebSocketClientForm_FormClosing;
    }

    private async void WebSocketClientForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (_clientWebSocket != null && _clientWebSocket.State == WebSocketState.Open)
        {
            await _clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Client closing", CancellationToken.None);
        }
    }

    private async void ConnectButton_Click(object sender, EventArgs e)
    {
        try
        {
            _clientWebSocket = new ClientWebSocket();
            _cancellationTokenSource = new CancellationTokenSource();

            await _clientWebSocket.ConnectAsync(new Uri("ws://localhost:8080"), _cancellationTokenSource.Token);
            LogMessage("已连接到 WebSocket 服务端。");

            // 开始接收消息
            _ = ReceiveMessagesAsync();
        }
        catch (Exception ex)
        {
            LogMessage($"连接服务端时出错: {ex.Message}");
        }
    }

    private async void SendButton_Click(object sender, EventArgs e)
    {
        if (_clientWebSocket != null && _clientWebSocket.State == WebSocketState.Open)
        {
            var message = MessageTextBox.Text;
            if (!string.IsNullOrEmpty(message))
            {
                var buffer = Encoding.UTF8.GetBytes(message);
                await _clientWebSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, _cancellationTokenSource.Token);
                LogMessage($"已发送消息: {message}");
            }
        }
    }

    private async Task ReceiveMessagesAsync()
    {
        var buffer = new byte[1024];
        while (_clientWebSocket.State == WebSocketState.Open)
        {
            var result = await _clientWebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), _cancellationTokenSource.Token);
            if (result.MessageType == WebSocketMessageType.Text)
            {
                var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
                LogMessage($"收到服务端消息: {message}");
            }
        }
    }

    private void LogMessage(string message)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new Action(() =>
            {
                LogTextBox.AppendText($"{DateTime.Now}: {message}{Environment.NewLine}");
            }));
        }
        else
        {
            LogTextBox.AppendText($"{DateTime.Now}: {message}{Environment.NewLine}");
        }
    }

}

}

相关推荐
xiaogutou11212 小时前
2026年历史课件PPT模板选购指南:教师备课效率与精度的平衡方案
开发语言·c#
Eiceblue5 小时前
使用 C# 将 Excel 转换为 Markdown 表格(含批量转换示例)
开发语言·c#·excel
不会编程的懒洋洋8 小时前
WPF XAML+布局+控件
xml·开发语言·c#·视觉检测·wpf·机器视觉·视图
唐青枫8 小时前
别再层层传参了!C#.NET AsyncLocal 异步上下文透传实战
c#·.net
明如正午9 小时前
【C#】托管调试助手 “PInvokeStackImbalance“:的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。
c#
Eiceblue9 小时前
C# 如何实现 Word 转 Excel ?分享两种实用方法
c#·word·excel
天才少女爱迪生9 小时前
word格式规范检测+自动修改【python】
python·c#·word
用户37215742613510 小时前
如何使用 C# 转换 PowerPoint 为 HTML:完整指南
c#
软泡芙11 小时前
【C# 】各种等待大全:从入门到精通
开发语言·c#·log4j
夏霞12 小时前
IIS 应用程序池 3 种标识:ApplicationPoolIdentity / LocalSystem / LocalService 权限区别(超清晰)
c#·.net