HarmonyOS鸿蒙Next开发环境模拟器通过tcp客户端连接宿主tcp服务器,能连接,但是发送的消息宿主服务器接收不到怎么回事?
HarmonyOS鸿蒙Next开发环境模拟器通过tcp客户端连接宿主tcp服务器,能连接,但是发送的消息宿主服务器接收不到怎么回事? 本机DevEco Studio开发环境,运行鸿蒙app在模拟器上,通过socket.TLSSocket单向认证连接服务器(服务器即为本机宿主机),服务端也是单向认证,能连接上,但是发送消息包时,服务端收不到消息。
服务端主要代码如下:
SslContext sslContext = SslContextBuilder.forServer(
new File(TLSNettyConfigMager.getCrtstore()), //server.crt
new File(TLSNettyConfigMager.getKeystore()), //server.key
TLSNettyConfigMager.getPassword()
).build();
并且绑定了宿主机的区域网ip:192.168.3.4
鸿蒙客户端代码如下:
// 创建TLS Socket实例
this.sockClient = socket.constructTLSSocketInstance();
let clientIpAddress: socket.NetAddress = {
address: '0.0.0.0',
port: 0,
family: 1 // IPv4
};
// 绑定本地IP地址和端口。
await new Promise<void>((resolve, reject) => {
this.sockClient!.bind(clientIpAddress, (err: Error) => {
if (err) {
Logger.error("Socket绑定失败", err);
reject(err);
} else {
Logger.info("Socket绑定", "Socket绑定成功");
resolve();
}
});
});
let context = this as common.UIAbilityContext;
let resourceManager = context.resourceManager;
let caCert = await resourceManager.getRawFileContent(ConfigManager.getConfig().socketserver.tls_castore);
let caStr = DataUtil.Uint8ArrayToString(caCert);
Logger.info("加载CA正常:", caStr);
// 客户端连接,单向认证只需要ca
let tlsSecureOption: socket.TLSSecureOptions = {
ca: [caStr],
protocols: [socket.Protocol.TLSv13, socket.Protocol.TLSv12],
useRemoteCipherPrefer: true
}
let serviceIpAddress: socket.NetAddress = {
address: ConfigManager.getConfig().socketserver.server_address, //此处绑定的是服务端的ip
port: ConfigManager.getConfig().socketserver.server_port,
family: 1 // IPv4
};
let tlsClientConnectOption: socket.TLSConnectOptions = {
address: serviceIpAddress,
secureOptions: tlsSecureOption
};
await new Promise<void>((resolve, reject) => {
// 添加延迟确保socket实例完全初始化
setTimeout(() => {
this.sockClient!.connect(tlsClientConnectOption, (err: BusinessError) => {
if (err) {
Logger.error("Socket连接失败", err);
reject(err);
} else {
Logger.info("Socket", "TLS连接成功");
this.isConnected = true;
// 订阅消息事件
this.sockClient!.on('message', (message: SocketMessage) => {
this.handleSocketMessage(message);
});
// 订阅错误事件
this.sockClient!.on('error', (error: BusinessError) => {
this.handleSocketError(error);
});
// 订阅关闭事件
this.sockClient!.on('close', () => {
this.handleSocketClose();
TLSSocketClientManager.getInstance().invoke("close");
});
resolve();
}
});
}, 50); // 50ms延迟确保实例初始化
});
鸿蒙客户端日志:
06-13 08:46:21.886 14539-14539 A03d00/JSAPP com.examp...lication I [TESTINFO][Socket] TLS连接成功
06-13 08:46:21.888 14539-14539 A03d00/JSAPP com.examp...lication I [TESTINFO][认证] 开始认证.......
06-13 08:46:21.890 14539-14539 A03d00/JSAPP com.examp...lication I [TESTINFO][Socket] TLS socket initialized successfully
06-13 08:46:21.895 14539-14539 A03d00/JSAPP com.examp...lication I [TESTINFO][encode 16进制结果:] 0x55 0xaa 0x00 0x00 0x00...................
06-13 08:46:21.901 14539-14539 A03d00/JSAPP com.examp...lication I [TESTINFO][发送数据开始:] 0x55 0xaa 0x00 0x00 0x00.......................
06-13 08:46:21.902 14539-14539 C015b0/NETSTACK com.examp...lication I [module_template.h:245] js invoke send
06-13 08:46:21.906 14539-14539 A03d00/JSAPP com.examp...lication I [TESTINFO][发送数据结束:] 0x55 0xaa 0x00 0x00 0x00.......................
服务端日志:
2025-06-13 09:34:19.693[nioEventLoopGroup-2-1]-INFO io.netty.handler.logging.LoggingHandler-[id: 0x1f377666, L:/192.168.3.4:62162] READ: [id: 0x154b7c3c, L:/192.168.3.4:62162 - R:/192.168.3.4:63269]
2025-06-13 09:34:19.694[nioEventLoopGroup-2-1]-INFO io.netty.handler.logging.LoggingHandler-[id: 0x1f377666, L:/192.168.3.4:62162] READ COMPLETE
2025-06-13 09:34:19.719[nioEventLoopGroup-3-3]-INFO cg.base.tcpsocket.facade.service.impl.NattyBaseHandler-客户端连接: /192.168.3.4:63269
2025-06-13 09:35:00.002[DefaultQuartzScheduler_Worker-2]-INFO cg.message.wechat.facade.minibase.impl.WeChatAuthSessionExpireServiceJob-WeChatAuthSessionExpireServiceJob print…tc…
2025-06-13 09:35:49.820[nioEventLoopGroup-3-3]-INFO cg.base.tcpsocket.facade.service.impl.NattyBaseHandler-读超时,关闭连接: /192.168.3.4:63269
2025-06-13 09:35:49.824[nioEventLoopGroup-3-3]-INFO cg.base.tcpsocket.facade.service.impl.NattyBaseHandler-客户端断开: /192.168.3.4:63269
服务端检测到客户长时间没有发送数据,自动关闭连接,但是客户端其实是发送数据了。
更多关于HarmonyOS鸿蒙Next开发环境模拟器通过tcp客户端连接宿主tcp服务器,能连接,但是发送的消息宿主服务器接收不到怎么回事?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
可能原因:
- 模拟器网络配置问题,未正确桥接宿主机网络
- 防火墙或安全软件阻挡了通信
- 端口未正确映射或绑定
- 发送的数据格式不符合服务器预期
- 网络地址转换(NAT)配置不当
排查步骤:
- 确认模拟器网络适配器设置为桥接模式
- 检查宿主机防火墙设置
- 使用抓包工具(Wireshark)验证数据包是否发出
- 测试本地环回通信是否正常
更多关于HarmonyOS鸿蒙Next开发环境模拟器通过tcp客户端连接宿主tcp服务器,能连接,但是发送的消息宿主服务器接收不到怎么回事?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
从日志和代码分析,问题可能出在以下几个方面:
- 网络配置问题:
- 模拟器网络与宿主机网络需要确保在同一网段
- 检查宿主机防火墙是否放行了指定端口(62162/63269)
- TLS握手问题:
- 客户端日志显示TLS连接成功但服务端没有收到数据
- 检查CA证书是否与服务端证书匹配
- 确认协议版本(TLSv1.2/1.3)两端配置一致
- 数据发送方式:
- 客户端显示调用了send但服务端未收到
- 建议在客户端send后添加回调检查发送结果
- 检查数据编码格式(服务端是否支持16进制格式)
- 模拟器网络限制:
- 鸿蒙模拟器可能对本地回环地址(127.0.0.1)支持不完善
- 尝试使用真实局域网IP而非0.0.0.0
建议先通过telnet或wireshark等工具确认网络连通性,再检查TLS握手过程是否完整。