SpringBoot Webflux创建TCP/UDP server并使用handler解析数据

 更新时间:2022年02月24日 09:55:10   作者:peng chao  
这篇文章主要介绍了SpringBoot Webflux创建TCP/UDP server并使用handler解析数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

1.pom依赖

引用spring-boot-starter-webflux依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webflux</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

2.创建UDP/TCP Server

package com.example.demo;
import com.example.demo.handler.TcpDecoderHanlder;
import com.example.demo.handler.UdpDecoderHanlder;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import reactor.core.publisher.Flux;
import reactor.netty.tcp.TcpServer;
import reactor.netty.udp.UdpServer;
import java.time.Duration;
@SpringBootApplication
public class DemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
	@Bean
	CommandLineRunner serverRunner(UdpDecoderHandler udpDecoderHandler, TcpDecoderHandler tcpDecoderHandler) {
		return strings -> {
			createUdpServer(udpDecoderHandler);
			createTcpServer(tcpDecoderHandler);
		};
	}
	/**
	 * 创建UDP Server
	 * @param udpDecoderHanlder: 解析UDP Client上报数据handler
	 */
	private void createUdpServer(UdpDecoderHandler udpDecoderHandler) {
		UdpServer.create()
				.handle((in,out) -> {
					in.receive()
							.asByteArray()
							.subscribe();
					return Flux.never();
				})
				.port(8888)
				.doOnBound(conn -> conn.addHandlerLast("decoder",udpDecoderHandler)) //可以添加多个handler
				.bindNow(Duration.ofSeconds(30));
	}
	/**
	 * 创建TCP Server
	 * @param tcpDecoderHanlder: 解析TCP Client上报数据的handler
	 */
	private void createTcpServer(TcpDecoderHandler tcpDecoderHandler) {
		TcpServer.create()
				.handle((in,out) -> {
					in.receive()
							.asByteArray()
							.subscribe();
					return Flux.never();
				})
				.doOnConnection(conn ->
						conn.addHandler(tcpDecoderHandler)) //实例只写了如何添加handler,可添加delimiter,tcp生命周期,decoder,encoder等handler
				.port(9999)
				.bindNow();
	}
}

3.数据解析handler(具体解析根据协议来)

解析UDP数据handler

package com.example.demo.handler;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.DatagramPacket;
import io.netty.handler.codec.MessageToMessageDecoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UdpDecoderHandler extends MessageToMessageDecoder<DatagramPacket>  {
    private static final Logger LOGGER = LoggerFactory.getLogger(TcpDecoderHandler.class);
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, DatagramPacket byteBuf, List<Object> list) throws Exception {
        ByteBuf byteBuf1 = byteBuf.content();
        int size = byteBuf1.readableBytes();
        byte[] data = new byte[size];
        byteBuf1.readBytes(data);
        LOGGER.info(new String(data));
    }
}

解析TCP数据handler

package com.example.demo.handler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TcpDecoderHandler extends MessageToMessageDecoder  {
    private static final Logger LOGGER = LoggerFactory.getLogger(TcpDecoderHandler.class);
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, Object o, List list){
        LOGGER.info("解析client上报数据");
    }
}

4.测试工具

推荐使用SocketTool调试TCP/UDP协议

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springboot Vue实现单点登陆功能示例详解

    Springboot Vue实现单点登陆功能示例详解

    这篇文章主要为大家介绍了Springboot Vue实现单点登陆功能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Spring中Eureka的服务下线详解

    Spring中Eureka的服务下线详解

    这篇文章主要介绍了Spring中Eureka的服务下线详解,根据默认的策略,如果在一定的时间内,客户端没有向注册中心发送续约请求,那么注册中心就会将该实例从注册中心移除,需要的朋友可以参考下
    2023-11-11
  • Java生产者和消费者例子_动力节点Java学院整理

    Java生产者和消费者例子_动力节点Java学院整理

    生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。下文通过实例给大家介绍java生产者和消费者,感兴趣的朋友一起学习吧
    2017-05-05
  • Java单列集合Collection常用方法示例详解

    Java单列集合Collection常用方法示例详解

    这篇文章主要介绍了Java单列集合Collection常用方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • java实现无符号数转换、字符串补齐、md5、uuid、随机数示例

    java实现无符号数转换、字符串补齐、md5、uuid、随机数示例

    这篇文章主要介绍了java实现无符号数转换、字符串补齐、md5、uuid、随机数示例,需要的朋友可以参考下
    2014-04-04
  • Java与SpringBoot对redis的使用方式

    Java与SpringBoot对redis的使用方式

    这篇文章主要介绍了Java与SpringBoot对redis的使用方式,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • lombok 找不到get/set方法的原因及分析

    lombok 找不到get/set方法的原因及分析

    这篇文章主要介绍了lombok 找不到get/set方法的原因及分析,具有很好的参考价值,希望对大家有所帮助。
    2022-06-06
  • 关于Java语法糖以及语法糖的原理和用法

    关于Java语法糖以及语法糖的原理和用法

    这篇文章主要介绍了关于Java什么是语法糖以及语法糖的种类,也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用,需要的朋友可以参考下
    2023-05-05
  • Java DefaultListableBeanFactory接口超详细介绍

    Java DefaultListableBeanFactory接口超详细介绍

    这篇文章主要介绍了Java DefaultListableBeanFactory接口,DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册机加载bean的默认实现
    2022-11-11
  • Java中特殊运算符及其应用详解

    Java中特殊运算符及其应用详解

    当涉及位操作和位级运算时,Java 提供了一组特殊的运算符,即左移(<<)和右移(>>)运算符,下面小编就带大家深入了解一下它们的具体应用吧
    2023-08-08

最新评论