HarmonyOS 鸿蒙Next TCPSocket 第二次连接收不到connect回调

发布于 1周前 作者 wuwangju 来自 鸿蒙OS

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连接未正确关闭/释放的问题。以下是一些排查和解决该问题的方向:

  1. 确保TCP连接正确关闭:在第一次连接使用后,确保通过调用相应的关闭接口(如close())来正确释放TCP连接资源。不恰当的关闭可能导致端口或资源未被系统回收,从而影响后续连接。

  2. 检查网络配置:确认网络配置无误,包括IP地址、端口号等是否正确,并且服务端能够接受新的连接请求。

  3. 查看系统日志:检查系统日志,尤其是网络相关的日志,可能包含有关连接失败或资源冲突的详细信息。

  4. 重试机制:在代码中实现一定的重试机制,以应对可能的短暂网络不稳定或资源锁定问题。

  5. 代码审查:仔细审查TCP连接建立相关的代码逻辑,确保没有逻辑错误或资源管理不当的地方。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。在联系客服时,提供详细的复现步骤、代码示例及日志信息,这将有助于快速定位问题。

回到顶部