public void feedbackMsgResponse(String channelStr, DecodeObject decObject) {
        Timeout timeoutTask = this.reqTimeouts.remove(decObject.getMessageId());
        if (timeoutTask != null) {
            timeoutTask.cancel();
        }
        TcpCallFuture callFuture = this.reqObjects.remove(decObject.getMessageId());
        if (callFuture == null) {
            return;
        }
        long curTime = System.currentTimeMillis();
        ConcurrentHashMap<Integer, Boolean> inflightMsgIds = channelMsgIdMap.get(channelStr);
        if (inflightMsgIds != null) {
            inflightMsgIds.remove(decObject.getMessageId());
        }
        try {
            callFuture.onMessageAck(decObject.getSendResult());
        } catch (Throwable ex) {
            if (callbackExceptCnt.shouldPrint()) {
                logger.info("ClientMgr({}) response come, callback exception!",
                        senderId, ex);
            }
        } finally {
            this.descInflightMsgCnt(callFuture);
            this.releaseAsyncCachedPermits(callFuture);
            if (decObject.getSendResult().isSuccess()) {
                baseSender.getMetricHolder().addCallbackSucMetric(callFuture.getGroupId(),
                        callFuture.getStreamId(), callFuture.getMsgCnt(),
                        (curTime - callFuture.getRtTime()), (System.currentTimeMillis() - curTime));
            } else {
                baseSender.getMetricHolder().addCallbackFailMetric(decObject.getSendResult().getErrCode(),
                        callFuture.getGroupId(), callFuture.getStreamId(), callFuture.getMsgCnt(),
                        (System.currentTimeMillis() - curTime));
            }
        }
    }
Build up the connection between the server and client.
inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/network/tcp/TcpClientMgr.java