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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

reactor线程模型_从TCP服务器到I/O模型,带你学习Netty

發布時間:2025/3/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 reactor线程模型_从TCP服务器到I/O模型,带你学习Netty 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習Netty就不得不從TCP服務器和I/O模型說起,了解TCP服務器架構和I/O模型的演進有助于深入了解Netty。

TCP服務器的架構

一般地,TCP服務器有兩種套接字,監聽套接字和已連接套接字。監聽套接字用于TCP的監聽,一旦連接建立便產生已連接套接字,服務器利用已連接套接字與客戶端進行通信。

  • 迭代服務器
  • 在迭代服務器中,監聽套接字會一直阻塞直到能夠接受連接,接受連接后利用已連接套接字與客戶端通信,這些工作都是在同一個線程中完成的,示意Java代碼如下。這種模式是串行處理,很難應對并發量較大的情況。
try (ServerSocket serverSocket = new ServerSocket(port)) { while (true) { Socket socket = serverSocket.accept(); // ... }} catch (IOException e) { e.printStackTrace();}
  • 并發服務器
  • 在并發服務器中,監聽套接字會一直阻塞直到能夠接受連接,接受連接后,服務器會讓子線程/進程去處理已連接套接字,示意Java代碼如下。這種模式雖然是并行處理,可以不干擾服務端的監聽,但是由于每次新來一個請求就會產生一個新的線程去處理,出于資源的考慮很難應對高并發的情況。
try (ServerSocket serverSocket = new ServerSocket(port)) { while (true) { final Socket socket = serverSocket.accept(); new Thread(() -> { // ... }).start(); }} catch (IOException e) { e.printStackTrace();}
  • IO多路復用(事件驅動)
  • 為了能在一個線程中處理多個連接,可以使用IO多路復用(事件驅動),典型的有Linux C中的select、poll和epoll,Java的Selector類等。以Selector為例,調用者在選擇器上為不同的連接注冊自己感興趣的事件(可讀/可寫/可接受/可連接),然后阻塞在select上,當事件發生時調用者便會得到通知,并且知道是哪個連接觸發了事件,以便可以進一步處理。
  • Selector實現的HTTP服務器示意如下:
public class NioServer { private static final int BUFFER_SIZE = 512; private static final String HTTP_RESPONSE_BODY = "Hello wolrd"; private static final String HTTP_RESPONSE_HEADER = "HTTP/1.1 200" + "Content-Type: text/html" + "Content-Length: " + HTTP_RESPONSE_BODY.length() + ""; private static final String HTTP_RESPONSE = HTTP_RESPONSE_HEADER + HTTP_RESPONSE_BODY; // IO多路復用 public void selector(int port) { try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); Selector selector = Selector.open()) { serverSocketChannel.configureBlocking(false); serverSocketChannel.bind(new InetSocketAddress(port)); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (true) { int readyChannels = selector.select(); if (readyChannels == 0) { continue; } Set selectedKeys = selector.selectedKeys(); Iterator iter = selectedKeys.iterator(); while (iter.hasNext()) { SelectionKey key = iter.next(); if (key.isAcceptable()) { SocketChannel channel = ((ServerSocketChannel) key.channel()).accept(); System.out.println("accept: " + channel); channel.configureBlocking(false); channel.register(selector, SelectionKey.OP_READ); } if (key.isReadable()) { SocketChannel channel = (SocketChannel) key.channel(); System.out.println("read: " + channel); ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); int bytesRead = channel.read(buffer); while (bytesRead > 0) { buffer.flip(); while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } buffer.clear(); bytesRead = channel.read(buffer); } ByteBuffer writeBuf = ByteBuffer.wrap(HTTP_RESPONSE.getBytes()); while (writeBuf.hasRemaining()) { channel.write(writeBuf); } channel.close(); } iter.remove(); } } } catch (IOException e) { e.printStackTrace(); } } }

I/O模型

一個輸入操作通常包括兩個不同的階段[1][2]

  • 等待數據準備好
  • 從內核向進程復制數據
  • (1) 阻塞式I/O模型

    (2) 非阻塞式I/O模型

    (3) I/O復用模型

    (4) 信號驅動式I/O模型

    (5) 異步I/O模型

    同步I/O和異步I/O對比

    POSIX把這兩個術語定義如下:

    • 同步I/O操作導致請求進程阻塞,直至I/O操作完成;
    • 異步I/O操作不導致請求進程阻塞。

    根據上述定義,前4種模型——阻塞式I/O模型、非阻塞式I/O模型、I/O復用模型和信號驅動式I/O模型都是同步I/O模型,因為其中真正的I/O操作(recvfrom)將阻塞進程。只有異步I/O模型與POSIX定義的異步I/O相匹配。

    Netty

    Netty是一款異步的事件驅動的網絡應用編程框架,支持快速地開發可維護的高性能的面向協議的服務器和客戶端。與使用阻塞I/O來處理大量事件相比,使用非阻塞I/O來處理更快速、更經濟,Netty使用了Reactor模式將業務和網絡邏輯解耦,實現關注點分離[3]

    Reactor模式

    Reactor模式(反應堆模式)是一種處理一個或多個客戶端并發交付服務請求的事件設計模式。當請求抵達后,服務處理程序使用I/O多路復用策略,然后同步地派發這些請求至相關的請求處理程序[4]

    Reactor模式中的角色:

    • Reactor:監聽端口,響應與分發事件;
    • Acceptor:當Accept事件到來時Reactor將Accept事件分發給Acceptor,Acceptor將已連接套接字的通道注冊到Reactor上;
    • Handler:已連接套接字做業務處理。

    單Reactor單線程

    在這種模式中,Reactor、Acceptor和Handler都運行在一個線程中。

    單Reactor多線程

    在這種模式中,Reactor和Acceptor運行在同一個線程,而Handler只有在讀和寫階段與Reactor和Acceptor運行在同一個線程,讀寫之間對數據的處理會被Reactor分發到線程池中。

    多Reactor多線程

    在這種模式中,主Reactor負責監聽,與Acceptor運行在同一個線程,Acceptor會將已連接套接字的通道注冊到從Reactor上,從Reactor負責響應和分發事件,起到類似多線程Reactor的作用。Netty服務端使用了該種模式。

    總結

    以上是生活随笔為你收集整理的reactor线程模型_从TCP服务器到I/O模型,带你学习Netty的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 久久国内偷拍 | 伊人网伊人影院 | 欧美成一区二区三区 | 人人色视频 | 综合国产视频 | 日本丰满熟妇videossex一 | 亚洲精品喷潮一区二区三区 | 亚洲色中色| 天天综合一区 | 日韩a在线观看 | 美女尿尿网站 | 久久瑟瑟 | 国产精品美女av | 四虎成人永久免费视频 | 亚洲国产精品av | 久草福利资源站 | 521a人成v香蕉网站 | 亚洲色图14p | 天天操天天操天天 | 国产精品视频自拍 | 一出一进一爽一粗一大视频 | 精品国偷自产国产一区 | 亚洲成人欧美 | 国产午夜视频在线观看 | 欧美一区二区三区的 | 久久久激情 | 男人视频网站 | 国产成人综合欧美精品久久 | 人妻夜夜爽天天爽 | 欧美激情视频一区二区三区 | 三女警花合力承欢猎艳都市h | mm131美女大尺度私密照尤果 | 国内久久精品视频 | 日噜 | 国产传媒视频在线观看 | 亚洲第5页| 成人午夜高清 | 不卡的av| 91插视频| 亚洲视频免费在线播放 | 啪啪官网| 欧美精品韩国精品 | 久久不卡视频 | 人人妻人人澡人人爽精品日本 | 亚洲精品黄色 | 国产女人高潮毛片 | 成人av一区二区三区在线观看 | 字幕网在线观看 | 99精品免费观看 | 国产精品自拍第一页 | 国产情侣第一页 | 亚洲国产久 | 国产精品视频在线免费观看 | 无码人妻丰满熟妇区毛片18 | 黄色av视屏| 青娱乐国产视频 | www.伊人.com | 国产午夜激情 | 亚洲综合视频网站 | 国产一区二区三区在线免费观看 | 操极品少妇 | 国产精品亚洲αv天堂无码 伊人性视频 | 日韩三级电影网址 | 黄色一毛片 | 女人扒开腿让男人桶爽 | 精品美女久久 | 长河落日电视连续剧免费观看 | 国产视频123区 | 久久爱99 | 精品在线观看一区二区 | 色哟哟无码精品一区二区三区 | 亚洲成人av一区二区三区 | 艳妇乳肉豪妇荡乳av | 综合久久综合久久 | 欧日韩一区二区三区 | 国产一区高清 | 欧美黄色片视频 | 色综合狠狠 | 国产亚洲91| 久操视频免费在线观看 | 在线观看视频91 | 丝袜av在线播放 | 久久天堂电影 | 特级精品毛片免费观看 | 免费黄色一级 | 玩弄丰满少妇xxxxx性多毛 | 国产综合久久久久 | 国产嫩草在线观看 | 夜夜操操操| 涩涩在线观看 | 亚洲综合图片网 | 牛牛热在线视频 | 亚洲丝袜av | 无码人妻丰满熟妇精品 | 久久精品观看 | 国产在线专区 | 91精品人妻一区二区三区蜜桃欧美 | 国模大胆一区二区三区 | av不卡在线观看 |