Springboot整合netty框架實現終端、通訊板子(單片機)TCP/UDP通信案例

這篇來講述一個springboot整合netty框架與單片機TCP/UDP通信開發小案例,開源架構正在開發當中,到時候開發者就可以像dubbo一樣使用netty來進行通信,從而把關注點放到業務層面。

隨着移動5G的快速發展,物聯網應用將會出現個爆發是增長,在這裏使用springboot整合netty來開發一套高性能的通信系統,成爲一種快速高效的實現方案。
爲什麼要用這兩個框架來實現通信服務呢?其中的優勢在我另一篇文章中會有體現,在這裏我們只討論實現的步驟。

實現步驟

  1. 準備的原材料工具
    我構建是用gradle來構建的,所以需要gradle、Google guava
    單片機、通訊板子(具備網絡連接模塊)

  2. 構建springboot工程
    使用idea構建springboot工程,構建完成後的工程目錄如下:
    工程的目錄結構

  3. 添加netty組件
    在這裏插入圖片描述

  4. 工程初始化
    工程構建完成後,就到了整個springboot和netty的核心部分了
    爲什麼要對工程進行初始化,這個就要從Netty本身的原理說起,初學的同學建議先了解一下netty的基本原理,然後再接着讀下面的內容。
    springboot是爲了簡化Spring應用的初始搭建以及後續開發過程的一個框架,在這次整合中我依然整合的是web架構。
    boot工程的主程序如下圖:
    在這裏插入圖片描述
    很顯然,如上圖的代碼是無法啓動netty來提供TCP服務的,所以我們需要在啓動spring工程後來初始化netty,用以提供完整的TCP鏈接服務。
    初始化netty的代碼如下圖:
    在這裏插入圖片描述

  5. 實現一個實時監控連接數的功能
    如下圖效果:
    在這裏插入圖片描述

  6. 客戶端的代碼
    客戶端使用的編碼解碼器是netty的String類型

public class NettyClient implements Runnable {

    @Override
    public void run() {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group);
            b.channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true);
            b.handler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel ch) throws Exception {
                    ChannelPipeline pipeline = ch.pipeline();
                    pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));
                    pipeline.addLast("frameEncoder", new LengthFieldPrepender(4));
                    pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
                    pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));

                    pipeline.addLast("handler", new ClientHandler());
                }
            });

            ChannelFuture f = b.connect("127.0.0.1", 8000).sync();
            f.channel().writeAndFlush("Netty Hello Service!" + Thread.currentThread().getName() + ":--->:" + Thread.currentThread().getId());
            f.channel().closeFuture().sync();
            InetSocketAddress socketAddress = (InetSocketAddress) f.channel().localAddress();
            System.out.print(String.format("Client port:{%s}", socketAddress.getPort()));

        } catch (Exception e) {
            System.out.print("netty服務異常了:{}");
            e.printStackTrace();
        } finally {
            group.shutdownGracefully();
            System.out.print("netty服務端斷開了鏈接:" + Thread.currentThread().getId());
        }
    }
}

如果要請求鏈接,直接實例化該類即可,連接到服務端
也可以用其他形式的請求鏈接方式,比如單片機使用WIFI模塊來鏈接

在這裏插入圖片描述
8.

總結

  1. 在使用netty之前一定要掌握netty的基本原理,做到知其然、知其所以然,才能夠在自己的業務系統中靈活得使用netty,才能夠做到和自己現有知識體系下的框架無縫結合。
  2. 任何框架必須是建立在能夠解決實際的業務需求基礎上的,不然就是空中樓閣,所以我們要做到架構落地,切勿不切實際的空談。

想要源碼的同學直接下載即可。
https://download.csdn.net/download/leegoowang/11022057

可能代碼寫得太通俗易懂了,導致該資源下載積分變得比較高,有需要得同學進羣我直接發給你
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章