博客
关于我
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/

    你可能感兴趣的文章
    org/eclipse/jetty/server/Connector : Unsupported major.minor version 52.0
    查看>>
    org/hibernate/validator/internal/engine
    查看>>
    Orleans框架------基于Actor模型生成分布式Id
    查看>>
    SQL-36 创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表。
    查看>>
    ORM sqlachemy学习
    查看>>
    Ormlite数据库
    查看>>
    orm总结
    查看>>
    os.environ 没有设置环境变量
    查看>>
    os.path.join、dirname、splitext、split、makedirs、getcwd、listdir、sep等的用法
    查看>>
    os.removexattr 的 Python 文档——‘*‘(星号)参数是什么意思?
    查看>>
    os.system 在 Python 中不起作用
    查看>>
    OS2ATC2017:阿里研究员林昊畅谈操作系统创新与挑战
    查看>>
    OSCACHE介绍
    查看>>
    SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
    查看>>
    OSChina 周五乱弹 ——吹牛扯淡的耽误你们学习进步了
    查看>>
    SQL--mysql索引
    查看>>
    OSChina 周四乱弹 ——程序员为啥要买苹果手机啊?
    查看>>
    OSChina 周日乱弹 —— 2014 年各种奇葩评论集合
    查看>>
    OSChina 技术周刊第十期,每周技术抢先看!
    查看>>
    OSError: no library called “cairo-2“ was foundno library called “cairo“ was foundno library called
    查看>>