前一陣子學習了基於.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的核心理念:
- 一個EventLoopGroup當中會包含一個或多個EventLoop。
- 一個EventLoop在它的整個生命週期當中都只會與唯一一個Thread進行綁定。
- 所有由EventLoop所處理的各種I/O事件都將在它所關聯的那個Thread上進行處理。
- 一個Channel在它的整個生命週期中只會註冊在一個EventLoop上。
- 一個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
如果感覺本文對您有幫助,請留下您的贊,您的支持是我堅持寫作最大的動力,謝謝!