最简单的网关转发程序
- 监控端口2222,接收端口接到的数据
- 将数据从第四位开始截取
- 将数据转发到另外一台主机 本示例是 本机 192.168.35.1:3333
盗用同事梁某版权,
使用技术: springboot netty
git hub 地址 :
https://github.com/wei198621/GetwayForwardByNettyUdp


<?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>
<groupId>com.tiza.leo</groupId>
<artifactId>UdpGetwayForwardByNetty</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.tiza.leo.UdpGetwayForwardByNetty.Boot</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.42.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
</dependencies>
</project>
spring:
profiles:
active: dev
gateway:
inPort: 2222
outIp: 192.168.35.1
outPort: 3333
package com.tiza.leo.UdpGetwayForwardByNetty;
import com.tiza.leo.UdpGetwayForwardByNetty.deamon.GatewayDeamon;
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;
/**
* @author leowei
* @date 2021/3/30 - 23:00
*/
@SpringBootApplication
public class Boot implements ApplicationRunner {
@Autowired
GatewayDeamon gatewayDeamon;
public static void main(String[] args) {
SpringApplication.run(Boot.class,args);
}
//执行网关收回进程
@Override
public void run(ApplicationArguments args) throws Exception {
gatewayDeamon.start();
}
}
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 org.springframework.stereotype.Component;
import java.net.InetSocketAddress;
/**
* @author leowei
* @date 2021/3/30 - 23:01
*/
@Slf4j
@ChannelHandler.Sharable
@Component
public class ReceiveHandler extends ChannelInboundHandlerAdapter {
@Autowired
private Environment env;
/*
1. 从 channel 中取到msg 转换为buf 后 截取前9位扔掉
2. 将剩余的数据打包为一个DatagramPacket 发往 出口
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
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();
//super.channelRead(ctx, msg);
}
}
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;
/**
* @author leowei
* @date 2021/3/30 - 23:02
*/
@Slf4j
@Service
public class 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)
//设置了UDP socket读缓冲区为2M
.option(ChannelOption.SO_RCVBUF, 1024 * 2048)
.handler(new ChannelInitializer<NioDatagramChannel>() {
@Override
protected void initChannel(NioDatagramChannel channel) throws Exception {
ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast("receive", receiveHandler);
}
});
ChannelFuture future = null;
future = bootstrap.bind(port).sync();
future.channel().closeFuture().sync();
} catch (Exception e) {
log.error(e.getMessage(),e);
}finally {
bossGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
}
}
本文介绍了一个使用SpringBoot和Netty构建的史上最简单的网关转发程序,该程序监听2222端口,接收数据并从第四个字符开始截取,然后将截取后的内容转发到192.168.35.1:3333。该项目由作者的同事梁某创建,并在GitHub上开源。
6355

被折叠的 条评论
为什么被折叠?



