Spring boot 在spring引导应用程序中创建要发送和接收的TCP客户端

Spring boot 在spring引导应用程序中创建要发送和接收的TCP客户端,spring-boot,tcp,spring-integration,spring-integration-dsl,Spring Boot,Tcp,Spring Integration,Spring Integration Dsl,我应该与一个遗留系统交互,在这个系统中,我必须使用java/kotlin中的spring集成来设置一个TCP客户机,以便向TCP系统发送消息并接收其响应,解析该响应并通过REST将其发送给其他客户机。我浏览了许多文档和博客,这些文档和博客告诉我如何通过xml进行操作。无法为所有内容找到相应的注释。任何代码片段都将非常有用 @Service class MyService{ @Autowired MyGateway gateway; public String callTCPClient(St

我应该与一个遗留系统交互,在这个系统中,我必须使用java/kotlin中的spring集成来设置一个TCP客户机,以便向TCP系统发送消息并接收其响应,解析该响应并通过REST将其发送给其他客户机。我浏览了许多文档和博客,这些文档和博客告诉我如何通过xml进行操作。无法为所有内容找到相应的注释。任何代码片段都将非常有用

@Service
class MyService{

@Autowired
MyGateway gateway;

public String callTCPClient(String msg){
    return gateway.exchange(msg);
}

}

如答案所示,在收到回复后,你可以做任何你想做的事情

@Bean
public IntegrationFlow client() {
    return IntegrationFlows.from(MyGateway.class)
            .handle(Tcp.outboundGateway(
                Tcp.netClient("localhost", 1234)
                    .serializer(codec()) // default is CRLF
                    .deserializer(codec()))) // default is CRLF
            .transform(Transformers.objectToString()) // byte[] -> String
            .get();
}

在本例中,我们只需将字节数组转换为字符串,但您可以对其执行任何操作,例如JSON to Object。您可以添加任意数量的步骤-添加
.handle(…)
元素以调用任意方法。请阅读。

有关客户端和服务器的DSL示例,请参阅。@GaryRussell我看到了您的帖子。我几乎不懂什么。如果我错了,请纠正我,我创建了一个接口并将其标记为网关(MyGateway.java),这样当我们调用该接口方法时,spring知道它必须将该消息发送给客户端。我在你的代码中没有理解的是,当我们收到客户机的响应时,它正在转换那里的代码本身。如果我有一个更复杂的转换,我应该怎么做?如果我想调用单独服务类中的方法,该怎么办?您能简单地向我解释一下吗。@GaryRussell,以及我如何告诉入站网关监听我通过出站网关发送的请求的响应?请参阅我的答案;我不理解您第二条评论中的问题。@GaryRussell我在第二条评论中的意思是,当我们声明服务器连接以接收响应时,如何告诉它侦听刚刚通过TCP客户端发送的请求的响应?在spring文档中,给出了“出站通道适配器使用客户端连接工厂,但您也可以提供对入站通道适配器的客户端连接工厂的引用。该适配器接收在出站适配器创建的连接上接收到的任何传入消息。“您能告诉我如何实现这一点吗?”?
@Bean
public IntegrationFlow client() {
    return IntegrationFlows.from(MyGateway.class)
            .handle(Tcp.outboundGateway(
                Tcp.netClient("localhost", 1234)
                    .serializer(codec()) // default is CRLF
                    .deserializer(codec()))) // default is CRLF
            .transform(Transformers.objectToString()) // byte[] -> String
            .get();
}