【问题标题】:Spring Integration TCP Listen For Second Response On Same SocketSpring Integration TCP 侦听同一套接字上的第二个响应
【发布时间】:2021-04-18 16:38:37
【问题描述】:

我有一个 Spring Boot 项目,我正在使用 Spring Integration 进行 TCP 通信。我将请求发送到服务器,服务器首先返回 06 作为 ACK。几秒钟后,实际响应来自服务器。有时 ACK 和实际响应会同时出现,但大多数情况下不会。 在春季集成中,我该如何处理?收到 ACK 后,我应该怎么做才能等待实际响应?或者我怎样才能阅读实际的回复?我怎样才能达到它?

这是我的 TCP 配置:

<bean id="messageSerializer"
      class="MyCustomByteArraySerializer"/>

<int-ip:tcp-connection-factory id="tcpClientFactory"
                               type="client"
                               host="${host}"
                               port="${port}"
                               so-keep-alive="true"
                               single-use="false"
                               using-nio="true"
                               serializer="messageSerializer"
                               deserializer="messageSerializer"/>

<ip:tcp-outbound-gateway id="outboundGateway"
                         connection-factory="tcpClientFactory"
                         request-channel="toTcpAdapterChannel"
                         reply-channel="fromTcpAdapterChannel"
                         auto-startup="true"
                         request-timeout="90000"
                         remote-timeout="90000"
                         reply-timeout="90000"/>

编辑:我的反序列化器是这样的:

@Override
    public byte[] deserialize(InputStream inputStream) throws IOException {
        int length = inputStream.available();
        logger.info("Available length of inputStream is: {}", length);
        byte[] incomingArray = new byte[length];
        this.read(inputStream, incomingArray, false);
        if (length == 1) {
            logger.info("Length is 1. Incoming byte: {}", HexUtils.toHexString(incomingArray));
            return null;
        } else {
            System.out.println("Message DUMP-1! " + HexUtils.toHexString(incomingArray));
            incomingArray = Arrays.copyOfRange(incomingArray, 1, length - 1);
        }
        return incomingArray;

    }

编辑 2:将代码带到 while 循环解决了我的问题。

@Override
    public byte[] deserialize(InputStream inputStream) throws IOException {
        boolean allMessageRead = false;
        byte[] incomingArray = new byte[0];
        while (!allMessageRead) {
            int length = inputStream.available();
            incomingArray = new byte[length];
            this.read(inputStream, incomingArray, false);
            if (length == 1) {
                logger.info("Available length of inputStream is: {}", length);
                logger.info("Length is 1. Incoming byte: {}", HexUtils.toHexString(incomingArray));
                return null;
            } else if (length > 1) {
                System.out.println("Message DUMP-1! " + HexUtils.toHexString(incomingArray));
                incomingArray = Arrays.copyOfRange(incomingArray, 1, length - 3);
                allMessageRead = true;
            }
        }


        return incomingArray;
    }

【问题讨论】:

    标签: spring tcp spring-integration


    【解决方案1】:

    您需要使用自定义反序列化器并丢弃您不感兴趣的部分。

    【讨论】:

    • 嗨,加里。我已经有一个自定义的反序列化器,当一个 1 字节的响应出现时,我会在反序列化方法中返回 null 来忽略它。我编辑了我的问题并添加了我的反序列化方法。
    • 不要返回null,只需在deserialize 中添加一个while 循环,直到你得到你期望的所有字节——这就是所有标准反序列化器所做的。 TCP是一个流;不能保证输入不会被分成数据包。
    • 谢谢加里。我试过你的评论,我可以在 ACK 之后得到实际的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2021-11-22
    • 2019-01-20
    相关资源
    最近更新 更多