TCP 客户端 Spring 与旧版服务器集成
TCP Client Spring Integration with Legacy Server
我需要一些帮助来迁移到 Spring 集成。
实际上我们有一个基于 java.net 包的组件,它只包含几个 类 和一个 java 经典 TCP 客户端,没什么特别的,它实际上可以通过以下方式向遗留服务器发送一些请求TCP。这是发送和接收消息的代码:
public String sendMessage(String info) {
try {
PrintStream ps = new PrintStream(clientSocket.getOutputStream());
ps.println(info);
InputStreamReader ir = new InputStreamReader(clientSocket.getInputStream());
BufferedReader br = new BufferedReader(ir);
return br.readLine();
} catch (IOException e) {
log.debug(e.getMessage());
}
return "";
}
问题是我想在客户端开始使用Spring集成,但我无法更改服务器,因为它属于另一家公司,但我没有收到服务器的响应,我尝试了很多配置,但一点运气都没有。
这是我现在的客户端配置:
<int:gateway id="gw"
service-interface="pe.financieraoh.core.cointegrador.tcp.SimpleGateway"
default-request-channel="input"/>
<int-ip:tcp-connection-factory id="client"
type="client"
host="localhost"
port="7777"
single-use="false"
serializer="connectionSerializeDeserialize"
deserializer="connectionSerializeDeserialize"
/>
<int:channel id="input" />
<int-ip:tcp-outbound-gateway id="outGateway"
request-channel="input"
reply-channel="clientBytes2StringChannel"
connection-factory="client"
request-timeout="10000"
reply-timeout="10000" />
<bean id="connectionSerializeDeserialize"
class="org.springframework.integration.ip.tcp.serializer.ByteArrayLfSerializer"/>
<int:object-to-string-transformer id="clientBytes2String"
input-channel="clientBytes2StringChannel" />
我尝试了很多并且总是收到 TimeOutConnection 异常,我很确定服务器没有收到我的请求,但我不能确定,因为我无权访问服务器日志。我唯一的指南是客户端中的遗留代码工作正常。
感谢您的帮助。
这是来自服务器的日志,我尝试了几种 de/serializer 结果相同,2020-06-21 23:47:10.377 ERROR 1 --- [nio-8080- exec-7] o.s.i.ip.tcp.TcpOutboundGateway : Tcp 网关异常 org.springframework.integration.MessageTimeoutException: 在 org.springframework.integration.ip.tcp.TcpOutboundGateway.getReply(TcpOutboundGateway.java:243) ~[spring-integration-ip 处等待响应超时-5.3.0.RELEASE.jar:5.3.0.RELEASE]
对于 println
和 readLine
的等效项,您需要 ByteArrayLfSerializer
(如果 运行 客户端位于 Linux/Unix/Mac)或默认 ByteArrayCrLfSerializer
(如果 运行 Windows 上的客户端)。
如果这不起作用,请使用 WireShark 或类似软件查看网络流量。
我需要一些帮助来迁移到 Spring 集成。 实际上我们有一个基于 java.net 包的组件,它只包含几个 类 和一个 java 经典 TCP 客户端,没什么特别的,它实际上可以通过以下方式向遗留服务器发送一些请求TCP。这是发送和接收消息的代码:
public String sendMessage(String info) {
try {
PrintStream ps = new PrintStream(clientSocket.getOutputStream());
ps.println(info);
InputStreamReader ir = new InputStreamReader(clientSocket.getInputStream());
BufferedReader br = new BufferedReader(ir);
return br.readLine();
} catch (IOException e) {
log.debug(e.getMessage());
}
return "";
}
问题是我想在客户端开始使用Spring集成,但我无法更改服务器,因为它属于另一家公司,但我没有收到服务器的响应,我尝试了很多配置,但一点运气都没有。 这是我现在的客户端配置:
<int:gateway id="gw"
service-interface="pe.financieraoh.core.cointegrador.tcp.SimpleGateway"
default-request-channel="input"/>
<int-ip:tcp-connection-factory id="client"
type="client"
host="localhost"
port="7777"
single-use="false"
serializer="connectionSerializeDeserialize"
deserializer="connectionSerializeDeserialize"
/>
<int:channel id="input" />
<int-ip:tcp-outbound-gateway id="outGateway"
request-channel="input"
reply-channel="clientBytes2StringChannel"
connection-factory="client"
request-timeout="10000"
reply-timeout="10000" />
<bean id="connectionSerializeDeserialize"
class="org.springframework.integration.ip.tcp.serializer.ByteArrayLfSerializer"/>
<int:object-to-string-transformer id="clientBytes2String"
input-channel="clientBytes2StringChannel" />
我尝试了很多并且总是收到 TimeOutConnection 异常,我很确定服务器没有收到我的请求,但我不能确定,因为我无权访问服务器日志。我唯一的指南是客户端中的遗留代码工作正常。 感谢您的帮助。
这是来自服务器的日志,我尝试了几种 de/serializer 结果相同,2020-06-21 23:47:10.377 ERROR 1 --- [nio-8080- exec-7] o.s.i.ip.tcp.TcpOutboundGateway : Tcp 网关异常 org.springframework.integration.MessageTimeoutException: 在 org.springframework.integration.ip.tcp.TcpOutboundGateway.getReply(TcpOutboundGateway.java:243) ~[spring-integration-ip 处等待响应超时-5.3.0.RELEASE.jar:5.3.0.RELEASE]
对于 println
和 readLine
的等效项,您需要 ByteArrayLfSerializer
(如果 运行 客户端位于 Linux/Unix/Mac)或默认 ByteArrayCrLfSerializer
(如果 运行 Windows 上的客户端)。
如果这不起作用,请使用 WireShark 或类似软件查看网络流量。