這篇來講述一個springboot整合netty框架與單片機TCP/UDP通信開發小案例,開源架構正在開發當中,到時候開發者就可以像dubbo一樣使用netty來進行通信,從而把關注點放到業務層面。
隨着移動5G的快速發展,物聯網應用將會出現個爆發是增長,在這裏使用springboot整合netty來開發一套高性能的通信系統,成爲一種快速高效的實現方案。
爲什麼要用這兩個框架來實現通信服務呢?其中的優勢在我另一篇文章中會有體現,在這裏我們只討論實現的步驟。
實現步驟
-
準備的原材料工具
我構建是用gradle來構建的,所以需要gradle、Google guava
單片機、通訊板子(具備網絡連接模塊) -
構建springboot工程
使用idea構建springboot工程,構建完成後的工程目錄如下:
-
添加netty組件
-
工程初始化
工程構建完成後,就到了整個springboot和netty的核心部分了
爲什麼要對工程進行初始化,這個就要從Netty本身的原理說起,初學的同學建議先了解一下netty的基本原理,然後再接着讀下面的內容。
springboot是爲了簡化Spring應用的初始搭建以及後續開發過程的一個框架,在這次整合中我依然整合的是web架構。
boot工程的主程序如下圖:
很顯然,如上圖的代碼是無法啓動netty來提供TCP服務的,所以我們需要在啓動spring工程後來初始化netty,用以提供完整的TCP鏈接服務。
初始化netty的代碼如下圖:
-
實現一個實時監控連接數的功能
如下圖效果:
-
客戶端的代碼
客戶端使用的編碼解碼器是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.
總結
- 在使用netty之前一定要掌握netty的基本原理,做到知其然、知其所以然,才能夠在自己的業務系統中靈活得使用netty,才能夠做到和自己現有知識體系下的框架無縫結合。
- 任何框架必須是建立在能夠解決實際的業務需求基礎上的,不然就是空中樓閣,所以我們要做到架構落地,切勿不切實際的空談。
想要源碼的同學直接下載即可。
https://download.csdn.net/download/leegoowang/11022057
可能代碼寫得太通俗易懂了,導致該資源下載積分變得比較高,有需要得同學進羣我直接發給你