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

使用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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:15:42