日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

netty系列之:netty中各不同种类的channel详解

發布時間:2024/2/28 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 netty系列之:netty中各不同种类的channel详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • ServerChannel和它的類型
    • Epoll和Kqueue
    • AbstractServerChannel
    • ServerSocketChannel
    • ServerDomainSocketChannel
    • SctpServerChannel
  • Channel和它的類型
    • UnixChannel
    • SctpChannel
    • DatagramChannel
    • DomainDatagramChannel
    • DuplexChannel
    • AbstractChannel
  • 總結

簡介

channel是連接客戶端和服務器端的橋梁,在netty中我們最常用的就是NIO,一般和NioEventLoopGroup配套使用的就是NioServerSocketChannel和NioSocketChannel,如果是UDP協議,那么配套使用的就是NioDatagramChannel,如果是別的協議還有其他不同的Channel類型。

這些不同channel類型有什么區別呢?一個直觀的感覺就是不同的channel和channel連接使用的協議有關系,不同的channel可能適配了不同的連接協議。

事實到底是不是如此呢?在netty的內部實現中到底有多少種channel呢?今天一起來探討一下。

ServerChannel和它的類型

雖然ServerChannel繼承自Channel,但是ServerChannel本身并沒有添加任何新的方法:

public interface ServerChannel extends Channel {}

所以對ServerChannel和Channel來說都可以看做是Channel,他們只是語義上有區別。

但是因為ServerChannel繼承自Channel,所以相對的ServerChannel的分類和實現要比Channel要少。所以我們先以ServerChannel為例進行講解。

ServerChannel的實現也有很多,我們以Abstract*開頭的實現為例,下面是他們的繼承關系:

從上圖我們可以看出,ServerChannel有六個抽象類實現,分別是AbstractEpollServerChannel,AbstractKQueueServerChannel,AbstractServerChannel,ServerSocketChannel,SctpServerChannel和ServerDomainSocketChannel。

其中前面三個抽象類同時繼承自AbstractChannel。

Epoll和Kqueue

Epoll和Kqueue是兩個獨特的依賴于特定平臺的NIO協議,其中epoll只在linux平臺才支持,而kQueue則在FreeBSD、NetBSD、OpenBSD、macOS 等操作系統支持。

我們來看下AbstractEpollServerChannel的構造函數:

protected AbstractEpollServerChannel(int fd) {this(new LinuxSocket(fd), false);}AbstractEpollServerChannel(LinuxSocket fd) {this(fd, isSoErrorZero(fd));}AbstractEpollServerChannel(LinuxSocket fd, boolean active) {super(null, fd, active);}

所有的構造函數都需要一個LinuxSocket的參數,LinuxSocket是一個socket用來提供對于linux native方法的訪問支持。

同樣的,我們再看一下AbstractKQueueServerChannel的構造函數:

AbstractKQueueServerChannel(BsdSocket fd) {this(fd, isSoErrorZero(fd));}AbstractKQueueServerChannel(BsdSocket fd, boolean active) {super(null, fd, active);}

AbstractKQueueServerChannel的構造函數需要傳入一個BsdSocket參數,BsdSocket是一個類用來提供對BSD系統的本地方法的訪問。

AbstractServerChannel

AbstractServerChannel我們在之前的channel一章中已經講過了,它的唯一實現就是LocalServerChannel,用于本地的transport。

ServerSocketChannel

ServerSocketChannel是一個以Socket連接為基礎的ServerChannel,既然是Socket連接,那么ServerSocketChannel中提供了一個InetSocketAddress類型的localAddress和一個remoteAddress, 另外還有一個ServerSocketChannelConfig屬性,用來存儲ServerSocketChannel相關的配置信息:

public interface ServerSocketChannel extends ServerChannel {@OverrideServerSocketChannelConfig config();@OverrideInetSocketAddress localAddress();@OverrideInetSocketAddress remoteAddress(); }

ServerDomainSocketChannel

ServerDomainSocketChannel是使用DomainSocket來進行通訊的ServerChannel。什么是DomainSocket呢?

DomainSocket的全稱是unix domain socket,它又可以叫做IPC socket,也就是inter-process communication socket,是在unix平臺上的同一服務器上的進程通信方式。

我們知道,協議是比較復雜的,對于傳統的socket通訊來說,需要定制特定的協議,然后進行封包和解包等操作,但是使用DomainSocket,可以直接將進程的數據直接拷貝,從而節約了時間,并提高了程序的效率。

DomainSocket的地址是一個文件的路徑,實際上是下面的一個結構體:

struct sockaddr_un {sa_family_t sun_family; /* AF_UNIX ,2字節*/char sun_path[UNIX_PATH_MAX]; /* 路徑名 */ };

在ServerDomainSocketChannel中的remoteAddress和localAddress的類型都是DomainSocketAddress,DomainSocketAddress有一個socketPath屬性,用來存儲DomainSocket文件的路徑。

SctpServerChannel

最后一個要講解的ServerChannel是SctpServerChannel,Sctp的全稱是Stream Control Transmission Protocol,他是一種類似于TCP/IP的協議。和SocketServerChannel一樣,SctpServerChannel中也有一個config叫做SctpServerChannelConfig,還提供了多個bindAddress方法用來綁定InetAddress.

有關Sctp協議的具體內容,本章不深入討論,感興趣的朋友可以關注后續的章節。

Channel和它的類型

Channel作為ServerChannel的父類,又有哪些實現呢?

先來看下常用channel的實現類:

看起來channel的實現類非常多,基本上都是按照channel中使用傳輸協議的類型來的。

我們具體來看一下相應的實現類。

UnixChannel

UnixChannel表示的unix平臺上的操作,它有一個fd方法,返回一個FileDescriptor:

FileDescriptor fd();

這也是unix和windows平臺的區別之一,unix平臺所有的一切都可以用文件來表示。

SctpChannel

在上面我講SctpServerChannel的時候我們提過了,Sctp是一個類似于tcp/ip的協議,SctpChannel中定義了協議中需要使用到的localAddress和remoteAddress:

InetSocketAddress localAddress();InetSocketAddress remoteAddress();

同時還定義了一些綁定方法:

ChannelFuture bindAddress(InetAddress var1);ChannelFuture bindAddress(InetAddress var1, ChannelPromise var2);ChannelFuture unbindAddress(InetAddress var1);ChannelFuture unbindAddress(InetAddress var1, ChannelPromise var2);

DatagramChannel

DatagramChannel用來處理UDP協議的連接,因為UDP有廣播的功能,所以DatagramChannel中提供了joinGroup的方法,來join一個multicast group:

ChannelFuture joinGroup(InetAddress multicastAddress);

當然,可以join就可以leave,還有一些leaveGroup的方法:

ChannelFuture leaveGroup(InetAddress multicastAddress);

還可以block某些地址在給定的networkInterface上的廣播:

ChannelFuture block(InetAddress multicastAddress, NetworkInterface networkInterface,InetAddress sourceToBlock);

這些方法都和UDP的特性是息息相關的。

DomainDatagramChannel

DomainDatagramChannel和之前提到的ServerDomainSocketChannel一樣,都是使用的IPC內部進程通訊技術,直接進行進程的拷貝,免去了協議解析等步驟,提升了處理速度。

DuplexChannel

DuplexChannel從名字看就是一個雙向的channel,duplex Channel有一個特點,就是channel的兩邊可以獨立的關閉,所以有下面的方法:

boolean isInputShutdown();ChannelFuture shutdownInput();boolean isOutputShutdown();ChannelFuture shutdownOutput();

DuplexChannel的是實現有很多種,比如常見的NIOSocketChannel,KQueueSocketChannel,EpollSocketChannel等。

AbstractChannel

另外一個channel的非常重要的子類就是AbstractChannel,AbstractChannel有三個非常重要的實現,分別是AbstractNioChannel,AbstractKQueueChannel和AbstractEpollChannel。

這三個類使用的都是NIO技術,不同的是第一個使用的是select,后面兩個使用的是平臺獨有的KQueue和Epoll技術。

其中NIO又可以分為NioByteChannel和NioMessageChannel,KQueue和Epoll又可以分為StreamChannel和DatagramChannel。

總結

以上就是channel在netty中的基本實現和分類。后面我們會詳解講解具體的channel到底是如何實現的。

本文已收錄于 www.flydean.com

最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!

總結

以上是生活随笔為你收集整理的netty系列之:netty中各不同种类的channel详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。