【发布时间】:2023-04-05 08:00:01
【问题描述】:
我知道 spring 集成有 TcpInboundGateway 和 ByteArrayStxEtxSerializer 来处理来自 TCP 端口的数据。
ByteArrayStxEtxSerializer 如果 TCP 服务器需要读取从客户端发送的所有数据然后处理它,则效果很好。 (请求和响应模型)我使用 single-use=false 以便可以在同一个连接中处理多个请求。
例如,如果客户端发送 0x02AAPL0x03,那么服务器可以发送 AAPL 价格。
如果客户端发送 0x02AAPL0x030x02GOOG0x03,我的 TCP 服务器正在工作。它发送 AAPL 价格和 GOOG 价格。
有时客户端可以发送 EOT (0x04)。如果客户端发送EOT,我想关闭socket连接。
例如:客户端请求可以是0x02AAPL0x030x02GOOG0x03 0x020x040x03。注意 EOT 出现在最后一个数据包中。
我知道可以自定义 ByteArrayStxEtxSerializer 解串器来读取客户端发送的字节。
解串器是关闭套接字连接的好地方吗?如果没有,应该如何通知spring集成框架关闭socket连接?
请帮忙。
这是我的弹簧配置:
<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"/>
更新: 添加 throw new SoftEndOfStreamException("Stream closed") 以关闭序列化程序中的流,我可以在 EventListener 中看到 CLOSED 日志条目。当服务器关闭连接时,我希望在客户端接收 java.io.InputStream.read() 作为 -1。但是客户端正在接收
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at sun.nio.cs.StreamDecoder.read0(StreamDecoder.java:107)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:93)
at java.io.InputStreamReader.read(InputStreamReader.java:151)
还有什么可以关闭服务器端的连接并将其传播到客户端吗?
感谢您的帮助。
谢谢
【问题讨论】:
标签: java sockets tcp spring-integration