You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# websocket-sharp:如何在不同代码区域使用已创建的WebSocket实例发送消息?

解决WebSocket实例跨方法访问的问题

嗨,这问题很常见,我刚接触WinForms的时候也踩过类似的坑😉

问题原因

你在buttonConnect_Click里声明的ws是局部变量,它的作用域只限于这个方法内部,所以buttonSendMessage_Click方法根本看不到它,自然就没法调用Send方法啦。

解决方案:把WebSocket变量提升为类的成员变量

我们只需要把ws的声明移到类的级别,让两个方法都能访问到它就行,具体步骤如下:

  1. 在你的窗体类内部、所有方法外面,声明一个私有WebSocket成员变量(按照C#命名惯例,成员变量通常用下划线开头):
private WebSocket _ws;
  1. 修改连接按钮的点击事件方法,把局部变量换成这个成员变量,同时可以加个旧连接的判断:
private void buttonConnect_Click(object sender, EventArgs e) { 
    // 如果已有活跃连接,先关闭再创建新连接
    if (_ws != null && _ws.State == WebSocketState.Open)
    {
        _ws.Close();
    }
    
    _ws = new WebSocket(textBoxSocketUrl.Text); 
    _ws.Connect(); 
} 
  1. 修改发送按钮的点击事件方法,使用这个成员变量,同时记得加判断避免空引用或者未连接的情况:
private void buttonSendMessage_Click(object sender, EventArgs e) { 
    // 先检查WebSocket实例是否存在且处于连接状态
    if (_ws == null || _ws.State != WebSocketState.Open)
    {
        MessageBox.Show("请先建立WebSocket连接!");
        return;
    }
    
    _ws.Send(textBoxMessage.Text); 
} 

额外小提示

  • 记得处理WebSocket的异常情况,比如连接失败、发送失败,可以加try-catch块来捕获错误,避免程序崩溃
  • 如果需要监听WebSocket的消息回调,也可以在类的成员变量上绑定事件,比如_ws.OnMessage += (sender, e) => { /* 处理收到的消息逻辑 */ };

内容的提问来源于stack exchange,提问作者octantsmake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:32:36