SpringBoot集成UDP,发送和接受消息
1.jar依赖
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-ip</artifactId>
</dependency>
2.服务端
package com.liming.app.udp;
import com.liming.app.common.cache.CacheSingleton;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
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.integration.ip.udp.UnicastSendingMessageHandler;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import static com.liming.app.modbusTcp.HexUtil.floatArrToIntArr;
import static com.liming.app.modbusTcp.HexUtil.stringToFloatArr;
@Slf4j
@Configuration
public class UdpClientConfig {
@Value("${udp.listeningPort}")
public Integer listeningPort;
@Value("${udp.sendingPort}")
public Integer sendingPort;
@Value("${udp.sendingIp}")
public String sendingIp;
@Bean
public IntegrationFlow integrationFlow() {
log.info("UDP服务启动成功,端口号为: {}", listeningPort);
return IntegrationFlows.from(Udp.inboundAdapter(listeningPort)).channel("udpChannel").get();
}
@Transformer(inputChannel = "udpChannel", outputChannel = "udpFilter")
public String transformer(@Payload byte[] payload, @Headers Map<String, Object> headers) throws UnsupportedEncodingException {
String message = new String(payload);
return message;
}
@Filter(inputChannel = "udpFilter", outputChannel = "udpRouter")
public boolean filter(String message, @Headers Map<String, Object> headers) {
String id = headers.get("id").toString();
String ip = headers.get("ip_address").toString();
String port = headers.get("ip_port").toString();
return true;
}
@Router(inputChannel = "udpRouter")
public String router(String message, @Headers Map<String, Object> headers) {
String id = headers.get("id").toString();
String ip = headers.get("ip_address").toString();
String port = headers.get("ip_port").toString();
if (true) {
return "udpHandle2";
}
return "udpHandle1";
}
@ServiceActivator(inputChannel = "udpHandle1")
public void udpMessageHandle(String message) throws Exception {
log.info("message:" + message);
}
@ServiceActivator(inputChannel = "udpHandle2")
public void udpMessageHandle2(String message) throws Exception {
log.info("UDP2:" + message);
}
public static void main(String[] args) {
String str = "701,50.0486,49.8133,500.486,157.029,1033.11,10.046,24.2811";
}
3.客户端
3.1 手动创建
@Slf4j
@RestController
@RequestMapping("/udp")
public class UdpController {
@GetMapping("/start")
public void start(){
String message = "123";
byte[] bytes = message.getBytes();
for (int i = 0; i < 10000; i++) {
InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 11005);
DatagramPacket datagramPacket = null;
try (DatagramSocket datagramSocket = new DatagramSocket()) {
datagramPacket = new DatagramPacket(bytes, bytes.length, socketAddress);
datagramSocket.send(datagramPacket);
datagramSocket.disconnect();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
}
}
3.2单例
@Slf4j
@Configuration
public class UdpClientConfig {
@Value("${udp.sendingPort}")
public Integer sendingPort;
@Value("${udp.sendingIp}")
public String sendingIp;
@Bean(name = "unicastSendingMessageHandler")
public UnicastSendingMessageHandler sending(){
return new UnicastSendingMessageHandler(sendingIp, sendingPort,true);
}
}
3.3使用
package com.liming.app.udp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.expression.FunctionExpression;
import org.springframework.integration.ip.udp.UnicastSendingMessageHandler;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
@Slf4j
@RestController
@RequestMapping("/udp")
public class UdpController {
@Autowired
private UnicastSendingMessageHandler unicastSendingMessageHandler;
@GetMapping("/send")
public void send(@RequestParam(value = "message") String message){
for (int i = 0; i < 10000; i++) {
unicastSendingMessageHandler.handleMessage(MessageBuilder.withPayload(message).build());
}
}
@GetMapping("/start")
public void start(){
String message = "123";
byte[] bytes = message.getBytes();
for (int i = 0; i < 10000; i++) {
InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 11005);
DatagramPacket datagramPacket = null;
try (DatagramSocket datagramSocket = new DatagramSocket()) {
datagramPacket = new DatagramPacket(bytes, bytes.length, socketAddress);
datagramSocket.send(datagramPacket);
datagramSocket.disconnect();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
}
}