Spring Boot集成udp通讯

加入依赖

<!--加入UDP通信所需依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-integration</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-ip</artifactId>
        </dependency>

编辑配置文件

application.yml

# 和嵌入式udp通信的发送端口和监听端口地址
udp:
  listeningPort: 9911
  sendingPort: 9911

配置相关属性


@Component
@ConfigurationProperties(prefix = "udp")
public class UdpConfig {

    /**
     * 与嵌入式通信的udp监听端口
     */
    private static Integer listeningPort;

    /**
     * 与嵌入式通信的udp发送端口
     */
    private static Integer sendingPort;

    @Value("${udp.listeningPort}")
    public void setListeningPort(Integer listeningPort) {
        this.listeningPort = listeningPort;
    }

    @Value("${udp.sendingPort}")
    public void setSendingPort(Integer sendingPort) {
        this.sendingPort = sendingPort;
    }

    public static Integer getListeningPort() {
        return listeningPort;
    }

    public static Integer getSendingPort() {
        return sendingPort;
    }
}

具体业务类


@Configuration
public class UdpServer {
    private static final Logger logger = LoggerFactory.getLogger(UdpServer.class);

    /**
     * UDP消息接收服务
     */
    @Bean
    public IntegrationFlow integrationFlow() {
        logger.info("UDP服务启动成功,端口号为: {}", UdpConfig.getListeningPort());
        return IntegrationFlows.from(Udp.inboundAdapter(UdpConfig.getListeningPort())).channel("udpChannel").get();
    }

    /**
     * 转换器
     */
    @Transformer(inputChannel = "udpChannel", outputChannel = "udpFilter")
    public String transformer(@Payload byte[] payload, @Headers Map<String, Object> headers) {
        String message = new String(payload);
        // todo 进行数据转换
        message = message.toUpperCase();
        return message;
    }

    /**
     * 过滤器
     */
    @Filter(inputChannel = "udpFilter", outputChannel = "udpRouter")
    public boolean filter(String message, @Headers Map<String, Object> headers) {
        // 获取来源Id
        String id = headers.get("id").toString();
        // 获取来源IP,可以进行IP过滤
        String ip = headers.get("ip_address").toString();
        // 获取来源Port
        String port = headers.get("ip_port").toString();
        // todo 信息数据过滤
//        if (true) {
//            // 没有-的数据会被过滤
//            return false;
//        }
        return true;
    }

    /**
     * 路由分发处理器:可以进行分发消息被那个处理器进行处理
     */
    @Router(inputChannel = "udpRouter")
    public String router(String message, @Headers Map<String, Object> headers) {
        // 获取来源Id
        String id = headers.get("id").toString();
        // 获取来源IP,可以进行IP过滤
        String ip = headers.get("ip_address").toString();
        // 获取来源Port
        String port = headers.get("ip_port").toString();
        // todo 筛选,走那个处理器
        if (true) {
            return "udpHandle2";
        }
        return "udpHandle1";
    }

    /**
     * 最终处理器1
     */
    @ServiceActivator(inputChannel = "udpHandle1")
    public void udpMessageHandle(String message) throws Exception {
        // todo 可以进行异步处理
        logger.info("message:" + message);
    }

    /**
     * 最终处理器2
     */
    @ServiceActivator(inputChannel = "udpHandle2")
    public void udpMessageHandle2(String message) throws Exception {
        logger.info("UDP2:" + message);
   		//接受消息处理业务
    }

public void sendMsg(String message) {
        byte[] bytes = message.getBytes();
        UnicastSendingMessageHandler handler = new UnicastSendingMessageHandler("localhost", UdpConfig.getSendingPort());
        logger.info("发送UDP信息: {" + bytes + "}");
        handler.handleMessage(MessageBuilder.withPayload(bytes).build());
        logger.info("发送成功");
    }
}

客户端


@RestController
@RequestMapping("/udp")
public class UdpClient {

    private final static Logger logger = LoggerFactory.getLogger(UdpClient.class);

    @PostMapping("/send")
    public BaseResult send(@RequestParam("message") String message) {
        byte[] bytes = message.getBytes();
        UnicastSendingMessageHandler handler = new UnicastSendingMessageHandler("localhost", UdpConfig.getSendingPort());
        logger.info("发送UDP信息: {" + bytes + "}");
        handler.handleMessage(MessageBuilder.withPayload(bytes).build());
        logger.info("发送成功");
        return new BaseResult<>();
    }
}

调试

接口请求客户端地址{ip:host}/udp/send
在这里插入图片描述
debug查看 成功接收到消息

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring Integration是一个用于构建企业集成解决方案的框架,它提供了对各种协议和数据格式的支持。在Spring Integration中,可以使用UDP适配器来实现与UDP协议的集成。 首先,需要在Spring Boot应用程序中添加Spring Integration的依赖。在pom.xml中添加以下依赖: ``` <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-core</artifactId> <version>${spring-integration.version}</version> </dependency> ``` 然后,在应用程序的配置文件中添加UDP适配器的配置。例如,以下配置将创建一个UDP适配器,它将监听本地IP地址为127.0.0.1,端口号为8888的UDP数据包: ``` <int-ip:udp-inbound-channel-adapter id="udpInboundAdapter" port="8888" host="127.0.0.1" channel="udpInputChannel"/> ``` 在上面的配置中,udpInputChannel是一个消息通道,它将接收从UDP适配器接收到的消息。可以在应用程序中定义一个消息处理器来处理这些消息。例如,以下配置将创建一个消息处理器,它将简单地将收到的消息打印出来: ``` <int:service-activator input-channel="udpInputChannel" ref="udpHandler" method="handleMessage"/> <bean id="udpHandler" class="com.example.UdpHandler"/> public class UdpHandler { public void handleMessage(String message) { System.out.println("Received message: " + message); } } ``` 在上面的配置中,UdpHandler类是一个简单的消息处理器,它将收到的消息打印到控制台。 最后,需要在应用程序中启动UDP适配器。可以在Spring Boot应用程序的启动类中添加以下代码: ``` @Autowired @Qualifier("udpInboundAdapter") private MessageProducer udpInboundAdapter; @PostConstruct public void start() { ((Lifecycle) udpInboundAdapter).start(); } @PreDestroy public void stop() { ((Lifecycle) udpInboundAdapter).stop(); } ``` 在上面的代码中,启动方法会启动UDP适配器,而停止方法会停止UDP适配器。 这样,就可以使用Spring Integration集成UDP协议了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值