Unity开发安卓应用与PC端C# TCP服务器连接失败问题咨询
问题排查与解决方案
Android联网权限缺失
Unity打包Android APK时默认不会主动授予完全的联网权限,这是90%以上同类问题的诱因。
修复方法:打开Unity编辑器的Edit > Project Settings > Player,切换到Android平台标签页,找到Publishing Settings配置项,将Internet Access选项设置为Required,不要使用默认的Auto,避免Unity无法识别TCP联网需求遗漏权限配置。服务端监听地址配置错误
若你的C#控制台服务端监听的是本地回环地址127.0.0.1,则仅允许本机程序接入,同一局域网的其他设备无法连接。
修复方法:修改服务端监听逻辑,绑定地址改为0.0.0.0(监听本机所有网卡)或者你的PC局域网固定IP192.168.1.133。主线程阻塞调用网络接口
Android系统强制禁止在UI主线程执行阻塞式网络操作,你在connectBtn方法中直接调用同步TcpClient.Connect方法,在手机上运行时会直接抛出异常中断执行,而Unity Editor运行时没有这项限制,所以PC端测试正常。
修复方法:将同步网络调用改为异步实现,可复用你已经写好的Client类中的ConnectAsync异步方法,或者将网络操作放到单独的子线程中执行。缓冲区未手动刷新导致数据未发送
你使用BufferedStream写入数据后直接释放对象,数据可能还滞留在缓冲区中未实际发出,不同设备的缓冲区触发自动刷新的阈值不同,就会出现PC正常手机无数据的情况。
修复方法:调用bufferedStream.Write之后新增一行bufferedStream.Flush()强制刷出缓冲区数据,或者直接去掉BufferedStream封装,直接向NetworkStream写入数据即可。
简易排查步骤
- 先在手机上安装局域网端口扫描工具,扫描PC的5000端口是否开放可访问,先确认网络链路无问题
- 在Unity中开启Android日志输出,运行APK时查看具体报错信息,可快速定位问题点
注:你当前贴出的C#服务端代码和Unity客户端代码重复,若服务端逻辑有其他问题可自行核对。
内容的提问来源于stack exchange,提问作者ekutukola

