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<>();
}
}