springboot集成udp通信

springboot集成udp通信

一、pom.xml配置

pom.xml文件中,加入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配置

application.yml文件中,加入和嵌入式udp通信的发送端口和监听端口地址。

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

三、配置类-UdpConfig

写配置类,将yml文件中的端口注入类对象中。

package com.hirain.modules.udp.config;

import io.swagger.annotations.Api;
import jdk.nashorn.internal.runtime.logging.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @Version 1.0
 * @Author meng.zhang6@hirain.com
 * @Created Date:2023/2/13 18:29
 * @Description <p>
 * @Modification <p>
 * Date Author Version Description
 * <p>
 * 2023/2/13 18:29 meng.zhang6@hirain.com 1.0 create file
 */

@Component
@Api(tags = "与嵌入式通信的配置文件")
@ConfigurationProperties(prefix = "udp")
public class UdpConfig {

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

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

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

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

    public static Integer getListeningPort() {
        return listeningPort;
    }

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

四、服务端-UdpServer

服务端,随程序自启动,时刻监听端口发来的udp包。

package com.hirain.modules.udp.server;

import com.hirain.modules.udp.config.UdpConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.Filter;
import org.springframework.integration.annotation.Router;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.annotation.Transformer;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.ip.dsl.Udp;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;

import java.util.Map;

/**
 * @Version 1.0
 * @Author meng.zhang6@hirain.com
 * @Created Date:2023/2/13 15:09
 * @Description <p>
 * @Modification <p>
 * Date Author Version Description
 * <p>
 * 2023/2/13 15:09 meng.zhang6@hirain.com 1.0 create file
 */

/**
 * UDP消息接收服务
 *
 * @author wliduo[i@dolyw.com]
 * @date 2020/5/20 14:16
 */
@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);
    }
}

五、客户端-UdpClient

客户端,调用即发送数据。

package com.hirain.modules.udp.client;

import com.hirain.common.utils.Result;
import com.hirain.modules.udp.config.UdpConfig;
import io.swagger.annotations.Api;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.integration.ip.udp.UnicastSendingMessageHandler;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


/**
 * @Version 1.0
 * @Author meng.zhang6@hirain.com
 * @Created Date:2023/2/13 15:08
 * @Description <p> Integration发送方式
 * @Modification <p>
 * Date Author Version Description
 * <p>
 * 2023/2/13 15:08 meng.zhang6@hirain.com 1.0 create file
 */

@RestController
@RequestMapping("/udp")
@Api(tags = "向嵌入式发送udp数据")
public class UdpClient {

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

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

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值