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

TCPListener与StreamSocket跨平台通信异常:PC-Hololens连接求助

解决TcpClient(PC)与StreamSocketListener(Hololens)的TCP连接异常问题

刚碰到过类似的跨API TCP连接问题,我来帮你一步步排查——你已经验证了UWP组件之间的双向通信都正常,问题出在.NET标准TcpClient和UWP StreamSocketListener的互操作上,核心原因通常是两者的默认配置不匹配,或者UWP的权限限制。

最可能的原因&优先排查项

1. UWP StreamSocketListener的默认保护级别不兼容

UWP的StreamSocketListener默认的SocketProtectionLevel可能不是明文传输(部分环境默认启用TLS),而.NET的TcpClient默认是不启用加密的明文连接,这会直接导致握手失败。

解决方法:在Hololens的监听代码中显式设置保护级别为PlainSocket:

var listener = new StreamSocketListener();
// 关键:强制使用明文TCP连接,匹配TcpClient的默认行为
listener.Control.ProtectionLevel = SocketProtectionLevel.PlainSocket;
await listener.BindServiceNameAsync("你的端口号");

2. UWP应用缺少网络权限

Hololens上的UWP应用如果没有声明对应的网络权限,会直接拒绝外部连接请求。

解决方法:打开Hololens项目的Package.appxmanifest,确保勾选以下权限:

  • Private Networks (Client & Server)(局域网连接场景)
  • Internet (Client & Server)(公网连接场景)

进一步排查步骤

3. 捕获并分析具体异常信息

在PC端的TcpClient代码中捕获详细异常,明确是连接超时、连接被拒绝,还是数据传输失败:

using (var client = new TcpClient())
{
    try
    {
        await client.ConnectAsync("Hololens的IP地址", 你的端口号);
        // 连接成功后的逻辑
    }
    catch (SocketException ex)
    {
        // 错误码可定位问题:比如10061是连接被拒绝,10060是超时
        Console.WriteLine($"连接异常:{ex.Message},错误码:{ex.ErrorCode}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"其他错误:{ex.Message}");
    }
}

4. 检查Hololens端的监听事件是否触发

在Hololens的ConnectionReceived事件中添加日志,确认是否收到了连接请求:

private async void Listener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
{
    Debug.WriteLine("收到PC端的连接请求!");
    // 后续的数据处理逻辑
}

如果日志没输出,说明连接请求根本没到达Hololens,需要检查网络路由、PC和Hololens的防火墙是否允许对应端口的入站/出站。

5. 抓包验证TCP握手过程

如果以上步骤都没问题,用Wireshark在局域网内抓包,查看TCP三次握手是否完成:

  • 如果SYN包发送后没有收到SYN-ACK:说明Hololens没收到请求,重点排查网络或防火墙
  • 如果三次握手完成但后续数据传输失败:可能是API的数据流处理差异,比如UWP的DataReader需要正确设置读取选项

完整可运行代码示例

PC端(TcpClient)

using System;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        string hololensIp = "192.168.1.100"; // 替换为你的Hololens IP
        int port = 12345; // 与Hololens端一致的端口

        using (var client = new TcpClient())
        {
            try
            {
                await client.ConnectAsync(hololensIp, port);
                Console.WriteLine("连接成功!");

                // 发送测试数据
                using (var stream = client.GetStream())
                {
                    byte[] data = Encoding.UTF8.GetBytes("Hello from PC TcpClient!");
                    await stream.WriteAsync(data, 0, data.Length);
                }
            }
            catch (SocketException ex)
            {
                Console.WriteLine($"连接失败:{ex.Message},错误码:{ex.ErrorCode}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"异常:{ex.Message}");
            }
        }
    }
}

Hololens端(StreamSocketListener)

using System;
using System.Diagnostics;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;

public class TcpListenerService
{
    private StreamSocketListener _listener;

    public async void StartListening()
    {
        _listener = new StreamSocketListener();
        // 关键配置:明文TCP连接
        _listener.Control.ProtectionLevel = SocketProtectionLevel.PlainSocket;
        _listener.ConnectionReceived += OnConnectionReceived;

        try
        {
            await _listener.BindServiceNameAsync("12345");
            Debug.WriteLine("Hololens监听已启动");
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"监听启动失败:{ex.Message}");
        }
    }

    private async void OnConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
    {
        Debug.WriteLine("收到PC端连接");
        using (var socket = args.Socket)
        using (var reader = new DataReader(socket.InputStream))
        {
            reader.InputStreamOptions = InputStreamOptions.Partial;
            try
            {
                uint bytesRead = await reader.LoadAsync(1024);
                string message = reader.ReadString(bytesRead);
                Debug.WriteLine($"收到消息:{message}");
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"接收数据失败:{ex.Message}");
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:45:49