HoloLens 2与PC端Unity应用TCP连接仅可正常工作一次故障求助
故障根因
- 服务端(HoloLens 2)侧:单次连接断开后未主动释放当前
StreamSocket资源,旧连接的ID上下文残留,导致新连接请求到达时,监听器无法正确分配资源处理新连接,触发你看到的「无对应ID设备连接」的报错。 - 客户端(PC侧):单次连接断开后,已创建的
TcpClient实例失效、监听线程自动退出,没有自动重置和重连逻辑,发起新的操作时直接使用已失效的连接对象,触发「远程主机强制关闭现有连接」报错。 - 额外问题:当前服务端逻辑同一时间仅支持处理1个客户端连接,没有多连接兼容逻辑,旧连接未释放的情况下无法接收新连接。
修复步骤
一、HoloLens 服务端代码修改
- 连接生命周期结束后主动释放Socket资源,修改
Listener_ConnectionReceived方法的异常捕获块:
catch (Exception e) { Debug.Log("disconnected!!!!!!!! " + e); // 新增:释放当前连接的Socket资源,解除占用 if (args.Socket != null) { args.Socket.Dispose(); } }
- 可选:如果需要支持多客户端同时连接,需要将每个连接的处理逻辑放到独立的异步任务中,避免当前连接的死循环阻塞监听器接收新连接。
- 权限检查:确认UWP打包的清单文件
Package.appxmanifest中已开启以下权限:- Internet(客户端和服务器)
- 专用网络(客户端和服务器)
二、PC 客户端代码修改
- 增加连接失效后的重置逻辑,修改
ListenForData方法的异常捕获块:
catch (SocketException socketExcep) { Debug.Log("socket exception:" + socketExcep); // 新增:连接失效后释放旧客户端资源 if (client != null) { client.Close(); client.Dispose(); client = null; } // 可选:添加自动重连逻辑,或者暴露重连方法给外部调用 }
- 增加手动重连入口,示例添加按R键触发重连的逻辑到
Update方法:
private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { SendMessage(); } // 新增:按R键触发重连 if (Input.GetKeyDown(KeyCode.R) && client == null) { ConnectToTcpServer(); } }
- 发送消息前增加连接有效性判断,修改
SendMessage方法的前置判断:
private void SendMessage() { // 修改:同时判断客户端存在且连接有效 if(client == null || !client.Connected) { Debug.Log("无可用TCP连接,请先重连"); return; } // 原有逻辑保持不变 ... }
内容的提问来源于stack exchange,提问作者Qiaodi Yuan
相关产品推荐
相关产品推荐

