1. 增加Netty TCP网络数据接收框架

2. 增加Netty Socket二进制控制协议接收框架
This commit is contained in:
HuangXin 2023-08-08 22:32:19 +08:00
parent 7fb827d1ca
commit f458a9ee47
15 changed files with 349 additions and 19 deletions

View File

@ -24,4 +24,4 @@ mybatis.mapper-locations=classpath*:mappers/*.xml
mybatis.type-aliases-package=com.zjyr.beidouservice.pojo.entry
#mybatis.configuration.default-enum-type-handler=com.dispose.common.CommonEnumHandler
#config log
#logging.config=
logging.config=file:config/logback.xml

View File

@ -1 +1 @@
spring.profiles.active=local
spring.profiles.active=local,user

102
config/logback.xml Normal file
View File

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true">
<property name="LOG_PATH" value="./logs"/>
<property name="LOG_LEVEL" value="info"/>
<property name="SVR_LOG_LEVEL" value="info"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="UTF-8">
<pattern>[%d{yy-MM-dd HH:mm:ss:SSS}][%-5p][%c{0}][%M\(%L\)][%t]: %m%n</pattern>
</encoder>
</appender>
<appender name="BIZ"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/biz.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/biz.log.%d{yyyyMMdd}
</fileNamePattern>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{yy-MM-dd HH:mm:ss:SSS}][%-5p][%c{0}][%M\(%L\)][%t]: %m%n</pattern>
</encoder>
</appender>
<appender name="SYSTEM-LOG-FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/system.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/system.log.%d{yyyyMMdd}
</fileNamePattern>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{yy-MM-dd HH:mm:ss:SSS}][%-5p][%c{0}][%M\(%L\)][%t]: %m%n</pattern>
</encoder>
</appender>
<appender name="DATA"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/data.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/data.log.%d{yyyyMMdd}
</fileNamePattern>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{yy-MM-dd HH:mm:ss:SSS}][%-5p][%c{0}][%M\(%L\)][%t]: %m%n</pattern>
</encoder>
</appender>
<logger name="com.dispose.restful" level="${SVR_LOG_LEVEL}"
additivity="false">
<appender-ref ref="DATA"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.dispose" level="${LOG_LEVEL}"
additivity="false">
<appender-ref ref="DATA"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.mybatis" level="${LOG_LEVEL}" additivity="false">
<appender-ref ref="DATA"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.apache.ibatis" level="${LOG_LEVEL}"
additivity="false">
<appender-ref ref="DATA"/>
</logger>
<logger name="org.mybatis.spring" level="${LOG_LEVEL}"
additivity="false">
<appender-ref ref="DATA"/>
</logger>
<logger name="org.springframework.jdbc" level="${LOG_LEVEL}"
additivity="false">
<appender-ref ref="DATA"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.springframework.orm" level="${LOG_LEVEL}"
additivity="false">
<appender-ref ref="DATA"/>
</logger>
<logger name="com.mysql" level="${LOG_LEVEL}" additivity="false">
<appender-ref ref="DATA"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="java.sql" level="${LOG_LEVEL}" additivity="false">
<appender-ref ref="DATA"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="javax.sql" level="${LOG_LEVEL}" additivity="false">
<appender-ref ref="DATA"/>
</logger>
<root level="${LOG_LEVEL}">
<appender-ref ref="SYSTEM-LOG-FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>

View File

@ -0,0 +1,24 @@
package com.zjyr.beidouservice;
import com.zjyr.beidouservice.adapter.impl.netty.impl.TcpServer;
import jakarta.annotation.Resource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan(basePackages = {"com.zjyr.beidouservice.mapper"})
public class BaidouServiceApplication implements ApplicationRunner {
@Resource
private TcpServer tcpServer;
public static void main(String[] args) {
SpringApplication.run(BaidouServiceApplication.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
tcpServer.start();
}
}

View File

@ -1,15 +0,0 @@
package com.zjyr.beidouservice;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan(basePackages = {"com.zjyr.beidouservice.mapper"})
public class TunnelServiceApplication {
public static void main(String[] args) {
SpringApplication.run(TunnelServiceApplication.class, args);
}
}

View File

@ -0,0 +1,30 @@
package com.zjyr.beidouservice.adapter.impl.netty;
import com.zjyr.beidouservice.adapter.impl.netty.decode.YuanRongProtocolDecode;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.timeout.IdleStateHandler;
import io.netty.util.CharsetUtil;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
@RequiredArgsConstructor
public class ChannelInit extends ChannelInitializer<SocketChannel> {
@Resource
private MessageHandler messageHandler;
@Override
protected void initChannel(SocketChannel channel) {
channel.pipeline()
.addLast("idle", new IdleStateHandler(0, 0, 60, TimeUnit.SECONDS))
.addLast("encode", new YuanRongProtocolDecode())
.addLast("decode", new StringDecoder(CharsetUtil.UTF_8))
.addLast("message", messageHandler);
}
}

View File

@ -0,0 +1,10 @@
package com.zjyr.beidouservice.adapter.impl.netty;
import jakarta.annotation.PreDestroy;
public interface ISocketServer {
void start() throws Exception;
@PreDestroy
void destory() throws InterruptedException;
}

View File

@ -0,0 +1,46 @@
package com.zjyr.beidouservice.adapter.impl.netty;
import com.zjyr.beidouservice.misc.HelperUtils;
import com.zjyr.beidouservice.pojo.vo.YuanRongBinProtocol;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@ChannelHandler.Sharable
@RequiredArgsConstructor
public class MessageHandler extends SimpleChannelInboundHandler<YuanRongBinProtocol> {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
log.info("{}:: Trigger Heart Signle", ctx.channel().id());
if (evt instanceof IdleStateEvent) {
} else {
super.userEventTriggered(ctx, evt);
}
}
@Override
public void channelRead0(ChannelHandlerContext ctx, YuanRongBinProtocol message) throws Exception {
log.info("{}:: Receive Message: {}", ctx.channel().id(), HelperUtils.bytesToHexString(message.getStart()));
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
log.info("{}:: Connected", ctx.channel().id());
super.channelActive(ctx);
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
log.info("{}:: Disonnected", ctx.channel().id());
super.channelActive(ctx);
ctx.close();
}
}

View File

@ -0,0 +1,25 @@
package com.zjyr.beidouservice.adapter.impl.netty.decode;
import com.zjyr.beidouservice.pojo.vo.YuanRongBinProtocol;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@RequiredArgsConstructor
public class YuanRongProtocolDecode extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception {
if (buffer.readableBytes() > 0) {
byte[] val = new byte[buffer.readableBytes()];
buffer.readBytes(val, 0, buffer.readableBytes());
YuanRongBinProtocol v = new YuanRongBinProtocol();
v.setStart(val);
out.add(v);
}
}
}

View File

@ -0,0 +1,63 @@
package com.zjyr.beidouservice.adapter.impl.netty.impl;
import com.zjyr.beidouservice.adapter.impl.netty.ChannelInit;
import com.zjyr.beidouservice.adapter.impl.netty.ISocketServer;
import com.zjyr.beidouservice.config.NettySocketConfigure;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import jakarta.annotation.PreDestroy;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.net.InetSocketAddress;
@Component
@Slf4j
@RequiredArgsConstructor
public class TcpServer implements ISocketServer {
@Resource
private final ChannelInit channelInit;
@Resource
private final NettySocketConfigure nettySocketConfigure;
private EventLoopGroup boosGroup;
private EventLoopGroup workerGroup;
private void tcpServer(int port) {
try {
new ServerBootstrap()
.group(boosGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.localAddress(new InetSocketAddress(port))
.childHandler(channelInit)
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.TCP_NODELAY, false)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.bind().sync();
log.info("Netty TCP Server Beginning Listen: {}", port);
} catch (Exception e) {
log.error(e.getMessage());
boosGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
@Override
public void start() {
log.info("Start Netty TCP Server");
boosGroup = new NioEventLoopGroup();
workerGroup = new NioEventLoopGroup();
this.tcpServer(nettySocketConfigure.getServerPort());
}
@PreDestroy
@Override
public void destory() {
}
}

View File

@ -0,0 +1,22 @@
package com.zjyr.beidouservice.config;
import jakarta.annotation.PostConstruct;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Data
@ConfigurationProperties(prefix = "socket")
@Configuration
@Slf4j
public class NettySocketConfigure {
private String serverHost;
private Integer serverPort;
private String serverMode;
@PostConstruct
private void initGlobalValue() {
log.debug("{}", serverHost);
}
}

View File

@ -0,0 +1,15 @@
package com.zjyr.beidouservice.misc;
public class HelperUtils {
public static String bytesToHexString(byte[] bArray) {
StringBuilder sb = new StringBuilder(bArray.length);
String sTemp;
for (byte b : bArray) {
sTemp = Integer.toHexString(0xFF & b);
if (sTemp.length() < 2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
}

View File

@ -0,0 +1,8 @@
package com.zjyr.beidouservice.pojo.vo;
import lombok.Data;
@Data
public class YuanRongBinProtocol {
private byte[] start;
}

View File

@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class TunnelServiceApplicationTests {
class BaidouServiceApplicationTests {
@Test
void contextLoads() {