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

C#实现带路径的WebSocket连接时提示无法打开套接字如何解决

问题原因

你之前的实现混淆了传输层TCP连接和应用层WebSocket协议的逻辑:

  • TcpClient是传输层组件,构造函数的第一个参数仅接受纯主机名/IP,你将路径拼接进主机地址后,系统会将整个IP+路径的字符串作为主机名尝试DNS解析,自然就会抛出「主机未知」的错误。
  • JS里的WebSocket是完整封装的应用层协议实现,会自动完成「建立TCP连接->发送带路径的HTTP升级请求->握手完成建立WebSocket连接」的全流程,不需要你手动处理分层逻辑。
正确实现方案

C#中可以直接用封装好的WebSocket客户端实现,不需要手动操作TcpClient,以下是两种常用实现方式:

方式1:使用.NET内置的ClientWebSocket(推荐,适用于.NET Core 2.0+、.NET 5+、.NET Framework 4.5+)

首先引用对应命名空间:

using System.Net.WebSockets;
using System.Text;

连接示例代码:

// 声明WebSocket客户端实例
using ClientWebSocket wsClient = new ClientWebSocket();
// 直接使用和JS代码完全一致的WebSocket地址即可
Uri wsAddress = new Uri("ws://localhost:8050/adapter/interface");

try
{
    // 发起连接,内部自动处理TCP握手、HTTP升级、路径传递逻辑
    await wsClient.ConnectAsync(wsAddress, CancellationToken.None);
    Console.WriteLine("连接建立成功");

    // ------------ 以下是收发消息的示例代码 ------------
    // 发送文本消息
    byte[] sendData = Encoding.UTF8.GetBytes("测试发送内容");
    await wsClient.SendAsync(
        new ArraySegment<byte>(sendData), 
        WebSocketMessageType.Text, 
        endOfMessage: true, 
        CancellationToken.None
    );

    // 接收服务端返回消息
    byte[] buffer = new byte[4096];
    WebSocketReceiveResult result = await wsClient.ReceiveAsync(
        new ArraySegment<byte>(buffer), 
        CancellationToken.None
    );
    string receiveContent = Encoding.UTF8.GetString(buffer, 0, result.Count);
    Console.WriteLine($"收到服务端消息:{receiveContent}");
}
catch (Exception ex)
{
    Console.WriteLine($"操作失败:{ex.Message}");
}
finally
{
    // 正常关闭连接
    if (wsClient.State == WebSocketState.Open)
    {
        await wsClient.CloseAsync(
            WebSocketCloseStatus.NormalClosure, 
            "主动关闭连接", 
            CancellationToken.None
        );
    }
}

方式2:使用第三方库WebSocketSharp(适用于老版本.NET Framework,用法更简单)

  1. 首先通过NuGet安装WebSocketSharp包
  2. 连接示例:
using WebSocketSharp;

// 直接传入和JS一致的完整WebSocket地址
var ws = new WebSocket("ws://localhost:8050/adapter/interface");

// 绑定消息接收事件
ws.OnMessage += (sender, e) =>
{
    Console.WriteLine($"收到消息:{e.Data}");
};

// 发起连接
ws.Connect();

// 发送消息
ws.Send("测试消息");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:45:05