C# websocket-sharp:如何在不同代码区域使用已创建的WebSocket实例发送消息?
解决WebSocket实例跨方法访问的问题
嗨,这问题很常见,我刚接触WinForms的时候也踩过类似的坑😉
问题原因
你在buttonConnect_Click里声明的ws是局部变量,它的作用域只限于这个方法内部,所以buttonSendMessage_Click方法根本看不到它,自然就没法调用Send方法啦。
解决方案:把WebSocket变量提升为类的成员变量
我们只需要把ws的声明移到类的级别,让两个方法都能访问到它就行,具体步骤如下:
- 在你的窗体类内部、所有方法外面,声明一个私有WebSocket成员变量(按照C#命名惯例,成员变量通常用下划线开头):
private WebSocket _ws;
- 修改连接按钮的点击事件方法,把局部变量换成这个成员变量,同时可以加个旧连接的判断:
private void buttonConnect_Click(object sender, EventArgs e) { // 如果已有活跃连接,先关闭再创建新连接 if (_ws != null && _ws.State == WebSocketState.Open) { _ws.Close(); } _ws = new WebSocket(textBoxSocketUrl.Text); _ws.Connect(); }
- 修改发送按钮的点击事件方法,使用这个成员变量,同时记得加判断避免空引用或者未连接的情况:
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
相关产品推荐
相关产品推荐

