java - Spring Boot TCP 客户端
问题描述
我正在寻找一个通过没有xml(spring-integration)的sping boot连接TCP的示例。
我从如何在 Spring Boot 中创建 Tcp 连接以接受连接?网址。
在此示例中,仅 main 方法就足以连接 tcp。为什么在这里声明其他bean和变压器?
这是错的吗?我不想使用简单的 Java 套接字客户端来接受响应,而是想与 Spring 集成。但是没有合适的例子可以使用 Java DSL。
能否请你帮忙?
package com.example;
import java.net.Socket;
import javax.net.SocketFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.annotation.Transformer;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.ip.tcp.TcpReceivingChannelAdapter;
import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory;
import org.springframework.integration.ip.tcp.connection.TcpNetServerConnectionFactory;
import org.springframework.integration.transformer.ObjectToStringTransformer;
import org.springframework.messaging.MessageChannel;
@SpringBootApplication
public class So39290834Application {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(So39290834Application.class, args);
Socket socket = SocketFactory.getDefault().createSocket("localhost", 9999);
socket.getOutputStream().write("foo\r\n".getBytes());
socket.close();
Thread.sleep(1000);
context.close();
}
@Bean
public TcpNetServerConnectionFactory cf() {
return new TcpNetServerConnectionFactory(9999);
}
@Bean
public TcpReceivingChannelAdapter inbound(AbstractServerConnectionFactory cf) {
TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
adapter.setConnectionFactory(cf);
adapter.setOutputChannel(tcpIn());
return adapter;
}
@Bean
public MessageChannel tcpIn() {
return new DirectChannel();
}
@Transformer(inputChannel = "tcpIn", outputChannel = "serviceChannel")
@Bean
public ObjectToStringTransformer transformer() {
return new ObjectToStringTransformer();
}
@ServiceActivator(inputChannel = "serviceChannel")
public void service(String in) {
System.out.println(in);
}
}
解决方案
该应用程序既是客户端又是服务器。
该问题专门关于如何使用 Spring Integration 编写服务器端(接受连接)。
该main()
方法只是一个连接到服务器端的测试。它使用标准的 Java 套接字 API;它也可以被编写为在客户端使用 Spring Integration 组件。
顺便说一句,您不必使用 XML 来编写 Spring Integration 应用程序,您可以使用注释对其进行配置,或者使用 Java DSL。阅读文档。
编辑
使用 Java DSL 的客户端/服务器示例
@SpringBootApplication
public class So54057281Application {
public static void main(String[] args) {
SpringApplication.run(So54057281Application.class, args);
}
@Bean
public IntegrationFlow server() {
return IntegrationFlows.from(Tcp.inboundGateway(
Tcp.netServer(1234)
.serializer(codec()) // default is CRLF
.deserializer(codec()))) // default is CRLF
.transform(Transformers.objectToString()) // byte[] -> String
.<String, String>transform(p -> p.toUpperCase())
.get();
}
@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();
}
@Bean
public AbstractByteArraySerializer codec() {
return TcpCodecs.lf();
}
@Bean
@DependsOn("client")
ApplicationRunner runner(MyGateway gateway) {
return args -> {
System.out.println(gateway.exchange("foo"));
System.out.println(gateway.exchange("bar"));
};
}
public interface MyGateway {
String exchange(String out);
}
}
结果
FOO
BAR
推荐阅读
- javascript - 如何获取表格的单元格索引?
- python - 无法在 jupyter notebook 中使用 mysql.connector 8.0 以正确的语法执行查询
- python - Tensorflow:将不同的函数映射应用于 tf 数组的不同轴?
- mysql - 检查与您的 MySQL 服务器版本相对应的手册,以了解在 ''execute_transaction'(IN sql_text VARCHAR(8000)) 附近使用的正确语法
- android - 如何从 adb shell 触发“Ok google”?
- c# - Application.DoEvents() 是多任务处理的一种形式吗?
- vba - 在括号中查找文本并更改某些匹配项
- java - p:calendar 时间滑块丢失小时和分钟
- java - 如何在 executeQuery 方法中编写 sql 查询?
- ios - 取消 iOS 麦克风回声消除和噪音抑制