我是靠谱客的博主 义气心锁,最近开发中收集的这篇文章主要介绍IOT云平台 simple(3)springboot netty实现TCP Server1 集成开发2 测试验证,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本系列教程包括:
IOT云平台 simple(0)IOT云平台简介
IOT云平台 simple(1)netty入门
IOT云平台 simple(2)springboot入门
IOT云平台 simple(3)springboot netty实现TCP Server
IOT云平台 simple(4)springboot netty实现简单的mqtt broker
IOT云平台 simple(5)springboot netty实现modbus TCP Master
IOT云平台 simple(6)springboot netty实现IOT云平台基本的架构(mqtt、Rabbitmq)

前提:安装软件:串口网络调试助手
本章首先本地建立TCP Server,用串口网络调试助手模拟终端设备与Server进行通信。
在这里插入图片描述

server:springboot+netty
client:串口网络调试助手

1 集成开发

第1步:引入POM文件:

        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.20.Final</version>
        </dependency>

创建主要的类:
1) TCPServerHandler:
server channel处理的类;
2 )TCPServerChannelInitializer
server channel初始化的类
3)TCPServer
server类。
4)TCPServerStartListener :监听到springboot启动后,启动netty Server。

1.1 server channel的处理

@Component
@Slf4j
public class TCPServerHandler extends ChannelInboundHandlerAdapter {
    public ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //从 channel  中取到msg  转换为buf
        ByteBuf byteBuf = (ByteBuf) msg;
        try {
            log.info("终端IP:" + ctx.channel().remoteAddress());
            log.info("收到数据:" + byteBuf.toString(CharsetUtil.UTF_8));

            ctx.channel().eventLoop().execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep( 1000);
                        String resStr = "01 03 00 02 00 23 A5 D3";
                        ctx.writeAndFlush(Unpooled.copiedBuffer(resStr, CharsetUtil.UTF_8));
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // (4)
        // 当出现异常就关闭连接
        cause.printStackTrace();
        ctx.close();
    }
}

1.2 server channel的初始化

@Component
public class TCPServerChannelInitializer extends ChannelInitializer {

    @Resource
    TCPServerHandler tcpServerHandler;

    protected void initChannel(Channel channel) throws Exception {
//        //心跳超时控制
        channel.pipeline().addLast("idle",
                new IdleStateHandler(15, 0, 0, TimeUnit.MINUTES));

        channel.pipeline().addLast(tcpServerHandler);
    }
}

1.3 创建TCP server

@Slf4j
@Component
public class TCPServer {
    @Value("${netty.port:8082}")
    private int port;
    @Value("${netty.bossThreadNum:1}")
    private int bossThreadNum;

    @Resource
    private TCPServerChannelInitializer TCPServerChannelInitializer;

    // 多线程事件循环器:接收的连接
    private EventLoopGroup bossGroup;
    // 实际工作的线程组 多线程事件循环器:处理已经被接收的连接
    private EventLoopGroup workGroup;
    private ChannelFuture channelFuture;

    public TCPServer() {
    }

    public void start() {
        log.info("TCPServer start:" + port);
        bossGroup = new NioEventLoopGroup(this.bossThreadNum);
        workGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();

            serverBootstrap.group(bossGroup, workGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(TCPServerChannelInitializer)
                    .option(ChannelOption.SO_BACKLOG, 128)
                    .childOption(ChannelOption.SO_KEEPALIVE, true);

            // 绑定端口,开始接收进来的连接
            channelFuture = serverBootstrap.bind(port).sync();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            destroy();
        }
    }

    public void destroy() {
        // 关闭socket
        try {
            channelFuture.channel().closeFuture().sync();
        } catch (Exception e) {
            e.printStackTrace();
        }

        bossGroup.shutdownGracefully();
        workGroup.shutdownGracefully();
        bossGroup = null;
        workGroup = null;
    }
}

1.4 监听到springboot启动后,启动netty Server

@Component
public class TCPServerStartListener implements ApplicationRunner {
    @Resource
    TCPServer tcpServer;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        tcpServer.start();
    }
}

2 测试验证

这里设置netty端口为8082,然后启动netty,串口网络调试助手设置好线相关参数,就可以进行i连接:
在这里插入图片描述

首先串口网络调试助手发送数据:01 03 00 2B 00 01 F4 02
在这里插入图片描述

可以看到,springboot控制输入log,说明server收到终端发送的数据:
在这里插入图片描述

然后,可以看到串口网络调试助手收到数据,说明终端收到Server返回的数据:
在这里插入图片描述
这样实现了云平台和终端之间的通信。

代码详见:
https://gitee.com/linghufeixia/iot-simple
code2

最后

以上就是义气心锁为你收集整理的IOT云平台 simple(3)springboot netty实现TCP Server1 集成开发2 测试验证的全部内容,希望文章能够帮你解决IOT云平台 simple(3)springboot netty实现TCP Server1 集成开发2 测试验证所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部