使用C# websocket-sharp连接Node.js ws服务无响应求助
问题排查与解决方案
1. 给客户端添加错误处理与生命周期保持
原客户端代码缺少错误捕获和程序阻塞逻辑,连接失败或发送完成后程序直接退出,无法定位问题。修改后的客户端代码如下:
using System; using WebSocketSharp; class Program { static void Main(string[] args) { try { WebSocket webSocket = new WebSocket("ws://localhost:2998"); // 监听错误、关闭、消息接收事件 webSocket.OnError += (sender, e) => Console.WriteLine($"客户端错误: {e.Message}"); webSocket.OnClose += (sender, e) => Console.WriteLine($"连接关闭: {e.Reason}"); webSocket.OnMessage += (sender, e) => Console.WriteLine($"收到服务端消息: {e.Data}"); webSocket.Connect(); Console.WriteLine("已连接到服务端"); webSocket.Send("test"); // 阻塞程序防止立即退出 Console.WriteLine("按任意键退出..."); Console.ReadLine(); webSocket.Close(); } catch (Exception ex) { Console.WriteLine($"连接失败: {ex.Message}"); } } }
2. 验证服务端运行状态
- 确保已安装依赖:执行
npm install ws typescript ts-node - 直接运行TypeScript文件:
npx ts-node server.ts(替换为你的服务端文件名) - 检查端口占用情况:
- Windows:
netstat -ano | findstr :2998 - macOS/Linux:
lsof -i :2998
- Windows:
3. 调整服务端监听配置(可选)
若本地环境存在网络限制,可修改服务端绑定所有地址,确保localhost能正常访问:
import { WebSocketServer } from 'ws'; const wss = new WebSocketServer({ port: 2998, host: '0.0.0.0' // 允许所有IP地址连接 }); wss.on("connection", (ws) => { console.log("connected"); ws.on('error', (err) => { console.error("服务端连接错误:", err); }); ws.on('message', function message(data) { console.log('received: %s', data.toString()); // 确保转为字符串输出 }); ws.send('something'); });
4. 检查websocket-sharp版本兼容性
websocket-sharp已停止维护,若上述步骤无效,可尝试:
- 更新NuGet包到最新版本(当前最新为0.10.3)
- 替换为.NET官方的
System.Net.WebSockets客户端,示例代码:using System; using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { using var client = new ClientWebSocket(); try { await client.ConnectAsync(new Uri("ws://localhost:2998"), CancellationToken.None); Console.WriteLine("已连接到服务端"); var message = Encoding.UTF8.GetBytes("test"); await client.SendAsync(new ArraySegment<byte>(message), WebSocketMessageType.Text, true, CancellationToken.None); var buffer = new byte[1024]; var result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); Console.WriteLine($"收到服务端消息: {Encoding.UTF8.GetString(buffer, 0, result.Count)}"); Console.WriteLine("按任意键退出..."); Console.ReadLine(); await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "客户端主动关闭", CancellationToken.None); } catch (Exception ex) { Console.WriteLine($"连接或发送失败: {ex.Message}"); } } }
内容的提问来源于stack exchange,提问作者PentaMine
相关产品推荐
相关产品推荐

