首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预读spring集成TCP服务器

预读spring集成TCP服务器
EN

Stack Overflow用户
提问于 2016-11-07 23:40:17
回答 1查看 328关注 0票数 0

我知道spring integration有TcpInboundGateway和ByteArrayStxEtxSerializer来处理通过TCP端口传入的数据。

如果TCP服务器需要读取从客户端发送的所有数据,然后对其进行处理,则ByteArrayStxEtxSerializer非常有效。(请求和响应模型)我使用single-use=false,以便可以在同一连接中处理多个请求。

例如,如果客户端发送0x02AAPL0x03,则服务器可以发送AAPL价格。

如果客户端发送0x02AAPL0x030x02GOOG0x03,则我的TCP服务器正在工作。它发送AAPL和GOOG的价格。

有时客户端在ETX (0x03)之后发送LRC (纵向冗余校验)。如果客户端发送LRC,我想读取并检查校验和。

我的客户端请求可以是0x02AAPL0x030x1E0x02GOOG0x03。注意:在这种情况下,LRC是0x1E。

我知道可以定制ByteArrayStxEtxSerializer反序列化程序来读取客户端发送的字节。有没有办法提前阅读来寻找LRC?如果没有LRC,那么读标记应该放回0x02,这样数据就可以由反串行化器以正常方式处理。

请建议如何处理可选的LRC。

下面是我的spring配置:

代码语言:javascript
复制
<int-ip:tcp-connection-factory id="crLfServer"
        type="server"
        port="${availableServerSocket}"
        single-use="false"
        so-timeout="10000"
        using-nio="false" 
        serializer="connectionSerializeDeserialize"
        deserializer="connectionSerializeDeserialize"
        so-linger="2000"/>

    <bean id="connectionSerializeDeserialize" class="org.springframework.integration.ip.tcp.serializer.ByteArrayStxEtxSerializer"/>

    <int-ip:tcp-inbound-gateway id="gatewayCrLf"
        connection-factory="crLfServer"
        request-channel="serverBytes2StringChannel"
        error-channel="errorChannel"
        reply-timeout="10000"/> <!-- reply-timeout works on inbound-gateway -->

    <int:channel id="toSA" />

    <int:service-activator input-channel="toSA"
        ref="myService"
        method="prepare"/>

    <int:object-to-string-transformer id="serverBytes2String"
        input-channel="serverBytes2StringChannel"
        output-channel="toSA"/>

    <int:transformer id="errorHandler"
        input-channel="errorChannel"
        expression="payload.failedMessage.payload + ':' + payload.cause.message"/>

谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-11-08 01:02:45

您需要以某种方式将输入流包装在PushbackInputStream中。

目前框架中还没有实现这一点的钩子;我将考虑在将来的版本中如何提供这样的可扩展性。

同时,一种解决方案是编写一个有状态的反序列化程序,它维护一个以InputStream参数为关键字的ConcurrentHashMap,其map值是一个PushbackInputStream包装器。您需要实现ApplicationListener<TcpConnectionCloseEvent>,以便在关闭套接字时清除映射条目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40469018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档