HarmonyOS 鸿蒙Next TCPSocket 第二次连接收不到connect回调
HarmonyOS 鸿蒙Next TCPSocket 第二次连接收不到connect回调
使用constructTCPSocketServerInstance创建TCPSocketServer对象并注册connect、error监听,在收到connect监听后注册TCPSocketConnection对象的message、close、error事件,然后执行listen,执行完数据传输以后,依次执行TCPSocketConnection.close(),反注册TCPSocketConnection对象的监听事件,反注册TCPSocketServer对象的监听事件,执行完上述流程以后,第二次重复执行上述流程时,收不到TCPSocketServer的connect监听事件是为何?上述流程中的方法没有catch到error,执行close方法后没有收到close事件回调,重启app又可以正常运行
2 回复
public init(ipAddress: string, port: number, timeout: number) {
if (this.mInit) {
return;
}
this.mInit = true;
this.mPort = port;
this.mIpAddress = ipAddress;
this.mTCPSocket = socket.constructTCPSocketServerInstance();
Logger.debug(TAG,JSON.stringify(this.mTCPSocket));
this.initNotify();
}
public async unInit() {
if (!this.mInit) {
return;
}
this.mInit = false;
this.mPort = 0;
this.mIpAddress = "";
this.closeClientSocket();
setTimeout(() => {
this.unInitClientNotify();
this.mSocketClient = undefined;
}, 2 * 1000);
setTimeout(() => {
this.unInitNotify();
this.mTCPSocket = undefined;
}, 3 * 1000);
}
public async listen() {
if (!this.mTCPSocket) {
return;
}
let listenAddr: socket.NetAddress = {
address: this.mIpAddress,
port: this.mPort,
family: 1
}
await this.mTCPSocket.listen(listenAddr).then(() => {
Logger.debug(TAG, 'listen done')
}).catch((err: BusinessError) => {
Logger.error(TAG, 'listen err:' + JSON.stringify(err))
});
this.mTCPSocket?.getState().then((value:socket.SocketStateBase)=>{
Logger.debug(TAG, 'state:' + JSON.stringify(value));
});
}
private initNotify() {
if (!this.mTCPSocket) {
return;
}
this.mTCPSocket.on('connect', this.mConnectCallback);
this.mTCPSocket.on('error', this.mSocketError);
}
private unInitNotify() {
if (!this.mTCPSocket) {
return;
}
this.mTCPSocket.off('connect', this.mConnectCallback);
this.mTCPSocket.off('error', this.mSocketError);
}
private async closeClientSocket() {
try {
if (this.mSocketClient) {
await this.mSocketClient.close().then(() => {
Logger.debug(TAG, 'close done')
}).catch((err: Object) => {
Logger.error(TAG, 'close err:' + JSON.stringify(err))
});
}
} catch (e) {
Logger.error(TAG, `closeSocket error=${JSON.stringify(e)}`);
}
}
private initClientNotify() {
if (!this.mSocketClient) {
return;
}
this.mSocketClient.on('message', this.mClientRecvCallback);
this.mSocketClient.on('close', this.mClientCloseCallback);
this.mSocketClient.on('error', this.mClientSocketError);
}
private unInitClientNotify() {
if (!this.mSocketClient) {
return;
}
this.mSocketClient.off('message', this.mClientRecvCallback);
this.mSocketClient.off('close', this.mClientCloseCallback);
this.mSocketClient.off('error', this.mClientSocketError);
}
在HarmonyOS鸿蒙系统中,针对TCPSocket第二次连接无法收到connect回调的问题,可能涉及到底层网络栈的状态管理或TCP连接未正确关闭/释放的问题。以下是一些排查和解决该问题的方向:
-
确保TCP连接正确关闭:在第一次连接使用后,确保通过调用相应的关闭接口(如
close()
)来正确释放TCP连接资源。不恰当的关闭可能导致端口或资源未被系统回收,从而影响后续连接。 -
检查网络配置:确认网络配置无误,包括IP地址、端口号等是否正确,并且服务端能够接受新的连接请求。
-
查看系统日志:检查系统日志,尤其是网络相关的日志,可能包含有关连接失败或资源冲突的详细信息。
-
重试机制:在代码中实现一定的重试机制,以应对可能的短暂网络不稳定或资源锁定问题。
-
代码审查:仔细审查TCP连接建立相关的代码逻辑,确保没有逻辑错误或资源管理不当的地方。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。在联系客服时,提供详细的复现步骤、代码示例及日志信息,这将有助于快速定位问题。