博客
关于我
java springboot netty 史上最简单的网关转发程序
阅读量:324 次
发布时间:2019-03-01

本文共 6479 字,大约阅读时间需要 21 分钟。

最简单的UDPServer网关转发程序实现

项目简介

本文将介绍一个简单的UDPServer网关转发程序,该程序用于接收指定端口的UDP数据包并将其转发到指定目标IP地址和端口。本程序使用Spring Boot和Netty技术,能够高效处理UDP数据包转发任务。


项目结构

1. 项目依赖管理

项目依赖主要包括以下几项:

  • Spring Boot:用于程序的快速开发和配置管理。
  • Netty:用于高效处理UDP数据包。
  • Lombok:简化Java代码编写。
  • Apache Commons Lang:用于字符串操作。

项目依赖管理文件如下:

4.0.0
com.tiza.leo
UdpGetwayForwardByNetty
1.0-SNAPSHOT
org.apache.maven.plugins
maven-compiler-plugin
8
8
org.springframework.boot
spring-boot-maven-plugin
com.tiza.leo.UdpGetwayForwardByNetty.Boot
repackage
org.springframework.boot
spring-boot-dependencies
2.2.1.RELEASE
pom
import
org.springframework.boot
spring-boot-starter-actuator
io.netty
netty-all
4.1.42.Final
org.project.lombok
lombok
1.18.12
org.apache.commons
commons-lang3
3.11

2. 项目配置

项目配置文件中定义了以下关键参数:

spring: profiles: active: devgatewayinPort: 2222outIp: 192.168.35.1outPort: 3333

核心技术实现

1. 项目启动类

package com.tiza.leo.UdpGetwayForwardByNetty;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Boot implements ApplicationRunner {    @Autowired    private GatewayDeamon gatewayDeamon;    public static void main(String[] args) {        SpringApplication.run(Boot.class, args);    }    @Override    public void run(ApplicationArguments args) throws Exception {        gatewayDeamon.start();    }}

2. 网关处理逻辑

package com.tiza.leo.UdpGetwayForwardByNetty.handler;import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelHandler;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;import io.netty.channel.socket.DatagramPacket;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.env.Environment;import java.net.InetSocketAddress;@Slf4j@Component(value = "receiveHandler", condition = "beanName")class ReceiveHandler extends ChannelInboundHandlerAdapter {    @Autowired    private Environment env;    @Override    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {        if (msg instanceof DatagramPacket) {            DatagramPacket datagramPacketIn = (DatagramPacket) msg;            ByteBuf buf = datagramPacketIn.copy().content();            buf.skipBytes(3);            InetSocketAddress address = new InetSocketAddress(env.getProperty("gateway.outIp"), Integer.parseInt(env.getProperty("gateway.outPort")));            DatagramPacket datagramPacketOut = new DatagramPacket(buf, address);            ctx.channel().writeAndFlush(datagramPacketOut).sync();            datagramPacketIn.release();        }    }}

3. 网关启动类

package com.tiza.leo.UdpGetwayForwardByNetty.deamon;import com.tiza.leo.UdpGetwayForwardByNetty.handler.ReceiveHandler;import io.netty.bootstrap.Bootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOption;import io.netty.channel.ChannelPipeline;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioDatagramChannel;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.couchbase.CouchbaseProperties;import org.springframework.core.env.Environment;import org.springframework.stereotype.Service;@Slf4j@Serviceclass GatewayDeamon {    @Autowired    private Environment env;    @Autowired    private ReceiveHandler receiveHandler;    public void start() {        NioEventLoopGroup bossGroup = new NioEventLoopGroup();        NioEventLoopGroup workGroup = new NioEventLoopGroup();        Integer port = env.getRequiredProperty("gateway.inPort", Integer.class);        log.info("绑定udp端口{}", port);        try {            Bootstrap bootstrap = new Bootstrap();            bootstrap.group(bossGroup)                    .channel(NioDatagramChannel.class)                    .option(ChannelOption.SO_BROADCAST, true)                    .option(ChannelOption.SO_RCVBUF, 1024 * 2048)                    .handler(new ChannelInitializer() {                        @Override                        protected void initChannel(NioDatagramChannel channel) throws Exception {                            ChannelPipeline pipeline = channel.pipeline();                            pipeline.addLast("receive", receiveHandler);                        }                    });            ChannelFuture future = bootstrap.bind(port).sync();            future.channel().closeFuture().sync();        } catch (Exception e) {            log.error(e.getMessage(), e);        } finally {            bossGroup.shutdownGracefully();            workGroup.shutdownGracefully();        }    }}

功能说明

  • 接收端口:程序监听指定端口(默认2222),接收所有发送至该端口的UDP数据包。
  • 数据处理:从每个接收到的数据包中,截取从第四位开始的内容,忽略前三位。
  • 数据转发:将处理后的数据包转发至指定目标IP地址和端口(默认192.168.35.1:3333)。
  • 高效处理:使用Netty实现非阻塞I/O,能够高效处理大量UDP数据包转发任务。

  • 项目部署

    1. 依赖安装

    在项目根目录下执行以下命令安装依赖:

    mvn clean install

    2. 应用运行

    运行主类:

    mvn spring-boot:run

    注意事项

  • 确保目标主机已启用UDP端口转发或防火墙规则允许转发。
  • 可根据实际需求调整转发目标IP地址和端口。
  • 如果需要处理大数据包,可根据需求调整Netty的读缓冲区大小。
  • 通过以上实现,您可以快速搭建一个简单的UDP数据包转发网关,满足基础的网络通信需求。

    转载地址:http://wrzo.baihongyu.com/

    你可能感兴趣的文章
    Python 函数随笔 map()函数,lambda自定义函数
    查看>>
    Python 分析天气,告诉你中秋应该去哪里
    查看>>
    python 列表中dict中key排序
    查看>>
    python 列表函数
    查看>>
    Python 列表删除相同的元素
    查看>>
    python 列表生成式
    查看>>
    Python 列表解析 大文件
    查看>>
    python 列表转字典方法
    查看>>
    Python 列表(List)概述-ChatGPT4o作答
    查看>>
    Python网络爬虫基础进阶到实战教程
    查看>>
    Python 初学者需要知道的四条建议
    查看>>
    Python 判断字符串是否包含子字符串
    查看>>
    python 判断当前时间是否为零点
    查看>>
    python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
    查看>>
    python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
    查看>>
    python 利用pyttsx3文字转语音
    查看>>
    python 利用已有Ner模型进行数据清洗合并
    查看>>
    python 到大数据开发工程师_如何成为一个大数据开发工程师?
    查看>>
    python 加密解密(base64, AES)
    查看>>
    Python 包管理器和 Node.js
    查看>>