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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Netty入门之Netty的基本介绍和IO模型

發布時間:2025/3/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Netty入门之Netty的基本介绍和IO模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.Netty介紹和應用場景

1.簡介

  • Netty是由JBOSS提供的一個java開源框架,現為Github上的獨立項目

  • Netty是一個異步的、基于事件驅動的網絡應用框架,用以快速開發高性能、高可靠性的網絡IO程序

  • Netty主要針對在TCP協議下,面向Clients端的高并發應用,或者Peer-to-Peer場景下的大量數據持續傳輸的應用

  • Netty本質是一個NIO框架,適用于服務器通訊相關的多種應用場景

2.應用場景

  • 互聯網行業:

    • 在分布式系統中,各個節點之間需要遠程服務調用,高性能的RPC框架必不可少,Netty作為異步高性能的通信框架,往往作為基礎通信組件被這些RPC框架使用

    • 典型的應用有:阿里分布式服務框架Dubbo的RPC框架使用Dubbo協議進行節點間通信,Dubbo協議默認使用Netty作為基礎通信組件,用于實現各進程節點之間的內部通信

  • 游戲行業

    • 無論是手游服務端還是大型的網絡游戲,java語言得到了越來越廣泛的應用

    • Netty作為高性能的基礎通信組件,提供了TCP/UDP和HTTP協議棧,方便定制和開發私有協議棧,賬號登錄服務器

    • 地圖服務器之間可以方便的通過Netty進行高性能的通信

  • 大數據領域

    • 經典的Hadoop的高性能通信和序列化組件(Avro實現數據文件共享)的RPC框架。默認采用Netty進行跨界點通信

    • 它的Netty Service基于Netty框架二次封裝實現

二.I/O模型

1.基本說明

1) I/O 模型簡單的理解:就是用什么樣的通道進行數據的發送和接收,很大程度上決定了程序通信的性能

2) Java 共支持 3 種網絡編程模型/IO 模式:BIO、NIO、AIO

3) Java BIO : 同步并阻塞(傳統阻塞型),服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷

?

4)Java NIO : 同步非阻塞,服務器實現模式為一個線程處理多個請求(連接),即客戶端發送的連接請求都會注 冊到多路復用器上,多路復用器輪詢到連接有 I/O 請求就進行處理

?

5)Java AIO(NIO.2) : 異步非阻塞,AIO 引入異步通道的概念,采用了 Proactor 模式,簡化了程序編寫,有效的請求才啟動線程,它的特點是先由操作系統完成后才通知服務端程序啟動線程去處理,一般適用于連接數較多且連接時間較長的應用

2.BIO、NIO、AIO的適用場景

1)BIO 方式適用于連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,并發局限于應用中,JDK1.4以前的唯一選擇,但程序簡單易理解。

2)NIO 方式適用于連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,彈幕系統,服務器間通訊等。編程比較復雜,JDK1.4 開始支持。

3)AIO 方式使用于連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用 OS 參與并發操作,編程比較復雜,JDK7 開始支持。

3.BIO

(1)基本介紹

1)Java BIO 就是傳統的 java io 編程,其相關的類和接口在 java.io

2)BIO(blocking I/O) : 同步阻塞,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需 要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,可以通過線程池機制改善(實現多個客戶連接服務器)。

3)BIO 方式適用于連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,并發局限于應用中,JDK1.4 以前的唯一選擇,程序簡單易理解

(2)工作機理

?

1)服務器端啟動一個ServerSocket

2)客戶端啟動Socket對服務器進行通信,默認情況下服務器端需要對每個客戶建立一個線程與之通訊

3)客戶端發出請求后, 先咨詢服務器是否有線程響應,如果沒有則會等待,或者被拒絕

4)如果有響應,客戶端線程會等待請求結束后,在繼續執行

(3)代碼示例

public class BIOServer {public static void main(String[] args) throws Exception { ?//線程池機制 ?//思路//1. 創建一個線程池//2. 如果有客戶端連接,就創建一個線程,與之通訊(單獨寫一個方法) ?ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); ?//創建ServerSocketServerSocket serverSocket = new ServerSocket(6666); ?System.out.println("服務器啟動了"); ?while (true) { ?System.out.println("線程信息 id =" + Thread.currentThread().getId() + " 名字=" + Thread.currentThread().getName());//監聽,等待客戶端連接System.out.println("等待連接....");final Socket socket = serverSocket.accept();System.out.println("連接到一個客戶端"); ?//就創建一個線程,與之通訊(單獨寫一個方法)newCachedThreadPool.execute(() -> {//可以和客戶端通訊handler(socket);}); ?} ? ?} ?/*** 編寫一個handler方法,和客戶端通訊** @param socket*/public static void handler(Socket socket) { ?try {System.out.println("線程信息 id =" + Thread.currentThread().getId() + " 名字=" + Thread.currentThread().getName());byte[] bytes = new byte[1024];//通過socket 獲取輸入流InputStream inputStream = socket.getInputStream(); ?//循環的讀取客戶端發送的數據while (true) { ?System.out.println("線程信息 id =" + Thread.currentThread().getId() + " 名字=" + Thread.currentThread().getName()); ?System.out.println("read....");int read = inputStream.read(bytes);if (read != -1) {//輸出客戶端發送的數據System.out.println(new String(bytes, 0, read)); } else {break;}} ? ?} catch (Exception e) {e.printStackTrace();} finally {System.out.println("關閉和client的連接");try {socket.close();} catch (Exception e) {e.printStackTrace();} ?}} }

通過 telnet 127.0.0.1 6666 連接該server,控制臺打印如下信息:

Connected to the target VM, address: '127.0.0.1:59843', transport: 'socket' 服務器啟動了 線程信息 id =1 名字=main 等待連接.... 連接到一個客戶端 線程信息 id =12 名字=pool-1-thread-1 線程信息 id =1 名字=main 等待連接.... 線程信息 id =12 名字=pool-1-thread-1 read....

(4)問題分析

1)每個請求都需要創建獨立的線程,與對應的客戶端進行數據 Read,業務處理,數據 Write

2)當并發數較大時,需要創建大量線程來處理連接,系統資源占用較大

3)連接建立后,如果當前線程暫時沒有數據可讀,則線程就阻塞在 Read 操作上,造成線程資源浪費

總結

以上是生活随笔為你收集整理的Netty入门之Netty的基本介绍和IO模型的全部內容,希望文章能夠幫你解決所遇到的問題。

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