DotNetty學習—— 總章(索引)

前一陣子學習了基於.net core的Socket編程。覺得很是有趣。準備深入學習一下Socket編程,聽聞Java的Netty框架很是優秀。所以今天來了解一下—DotNetty

這個東西是怎麼來的呢?   是.net core版的Netty。具體怎麼來的請自行百度。在此不贅述!!!

Netty是一個提供 asynchronous event-driven (異步事件驅動)的網絡應用框架,是一個用以快速開發高性能、可擴展協議的服務器和客戶端。

換句話說,Netty 是一個 NIO (同步非阻塞)客戶端服務器框架,使用它可以快速簡單地開發網絡應用程序,比如服務器和客戶端的協議。Netty 大大簡化了網絡程序的開發過程比如 TCP 和 UDP 的 socket 服務的開發。

socket通信分爲三種:

BIO:  傳統阻塞IO

NIO: 同步非阻塞式IO

AIO: 異步非阻塞IO,(非阻塞採用的是註冊通知的模式。)

官方也提供了一些例子。地址如下

https://github.com/Azure/DotNetty

也可自行看例子學習

下面開始學習。和簡單摸索!(參考Netty官方文檔會比看我我寫的學習更快)

https://waylau.com/netty-4-user-guide/    中文文檔(非官方翻譯)

http://netty.io/wiki/all-documents.html   英文文檔

因爲本人比較小白。所以此篇文章會從最開始創建項目開始爲大家一一講述

Netty的核心理念:

  1. 一個EventLoopGroup當中會包含一個或多個EventLoop。
  2. 一個EventLoop在它的整個生命週期當中都只會與唯一一個Thread進行綁定。
  3. 所有由EventLoop所處理的各種I/O事件都將在它所關聯的那個Thread上進行處理。
  4. 一個Channel在它的整個生命週期中只會註冊在一個EventLoop上。
  5. 一個EventLoop在運行過程中,會被分配給一個或多個Channel。

1.首先創建.net core 項目,創建空項目

2.引入DotNetty相關引用

NuGet一搜索DotNetty會發現一堆相關引用。這裏需要講一下各個庫都是分別做什麼的

DotNetty.Buffers: 對內存緩衝區管理的封裝。

DotNetty.Codecs: 對編解碼是封裝,包括一些基礎基類的實現,我們在項目中自定義的協議,都要繼承該項目的特定基類和實現。

DotNetty.Codecs.Mqtt: MQTT(消息隊列遙測傳輸)編解碼是封裝,包括一些基礎基類的實現。

DotNetty.Codecs.Protobuf: Protobuf 編解碼是封裝,包括一些基礎基類的實現。

DotNetty.Codecs.ProtocolBuffers: ProtocolBuffers編解碼是封裝,包括一些基礎基類的實現。

DotNetty.Codecs.Redis: Redis 協議編解碼是封裝,包括一些基礎基類的實現。

DotNetty.Common: 公共的類庫項目,包裝線程池,並行任務和常用幫助類的封裝。

DotNetty.Handlers: 封裝了常用的管道處理器,比如Tls編解碼,超時機制,心跳檢查,日誌等。

DotNetty.Transport: DotNetty核心的實現,Socket基礎框架,通信模式:異步非阻塞。

DotNetty.Transport.Libuv: DotNetty自己實現基於Libuv (高性能的,事件驅動的I/O庫) 核心的實現。


channelActive() 方法將會在連接被建立並且準備進行通信時被調用。因此讓我們在這個方法裏完成一個代表當前時間的32位整數消息的構建工作。

回調方法 觸發時機 client server
channelRegistered 當前channel註冊到EventLoop true true
channelUnregistered 當前channel從EventLoop取消註冊 true true
channelActive 當前channel激活的時候 true true
channelInactive 當前channel不活躍的時候,也就是當前channel到了它生命週期末 true true
channelRead 當前channel從遠端讀取到數據 true true
channelReadComplete channel read消費完讀取的數據的時候被觸發 true true
userEventTriggered 用戶事件觸發的時候    
channelWritabilityChanged channel的寫狀態變化的時候觸發    

 


注:一下重點解析服務端,客戶端只附上代碼

3.寫一個世界上最簡單的服務(Discard)

有了如上這些準備工作。下面咱們就可以開始寫一些服務了。由於書寫量過多。所以所有單獨服務都會令開闢文章

服務端:

https://blog.csdn.net/a1234012340a/article/details/91041956

客戶端:

https://blog.csdn.net/a1234012340a/article/details/93138687

4.應答服務(Echo)

服務端:

https://blog.csdn.net/a1234012340a/article/details/92649538

客戶端:

因爲Echo和Discard本身沒有太大的區別。只不過一個是丟棄,另一個是讀取數據顯示,並且返回數據。客戶端獲取返回數據,顯示(和服務端流程一樣)。所以Echo的客戶端代碼以及講解就不在贅述!

5.時間服務(Time)

服務端:

https://blog.csdn.net/a1234012340a/article/details/92650374

6.WebSocket實現

https://blog.csdn.net/a1234012340a/article/details/100040073

 

 


完全個人研究,有錯希望大神糾正。也可留下您的聯繫方式,共同探討

——————————————————————————————————

作者:Henny_CHN

轉載請標明出處,原文地址:  

https://blog.csdn.net/a1234012340a/article/details/91040073

如果感覺本文對您有幫助,請留下您的贊,您的支持是我堅持寫作最大的動力,謝謝!

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