天天看點

java-Netty學習(2)

java-Netty學習(2)

同時連到一個伺服器的多個用戶端。理論上,可支援的用戶端數量是受可支配系統資源限制的(以及在用的JDK版本帶來的限制)。Echo用戶端和伺服器之間的互動非常簡單; 用戶端建立一個連接配接後,它送一條或者多條消息到伺服器,然後伺服器再将該消息送回用戶端。雖然這個互動看起來不那麼實用,但卻是一個典型的用戶端/伺服器系統請求-響應互動過程的示例。

所有的Netty伺服器都需要:

至少一個ChannelHandler—這個元件實作了伺服器如何處理從用戶端收到的資料—它的業務邏輯。

Bootstrapping—這是配置伺服器的啟動代碼。至少要做的是,它把伺服器綁到一個可以監聽連接配接請求的端口上。

ChannelInboundHandler:定義了作用于輸入事件的方法。這個簡單的應用隻需要這個接口的一些方法,是以用子類ChannelInboundHandlerAdapter就足夠了,這個子類提供了ChannelInboundHandler的預設實作。

ChannelInboundHandlerAdapter有簡明直接的API,每個方法都可以被重寫(overridden),鈎挂到(hook into)event生命周期的适當時間點。因為你需要處理所有收到的資料,是以你得重寫channelRead()。在這個伺服器裡,你隻要簡單地把收到的消息送回遠端。

重寫exceptionCaught()讓你可以對任何Throwable的子類型做出反應—在這裡,你列印了這個異常然後關閉了這個連接配接。一個更加複雜的應用也許會試着從異常中恢複,但是在這個例子中,僅僅把連接配接關閉就向遠端發出了錯誤已經發生的信号。

如果異常沒有被捕獲會發生什麼?

每個Channel有一個對應的ChannelPipeline,這個ChannelPipeline有一串ChannelHandler執行個體。預設情況下,一個handler會傳遞某個handler方法的調用到下一個handler。是以,如果在這個傳遞鍊中exceptionCaught()沒有實作,異常會一直走到ChannelPipeline的終點,然後被載入日志。因為這個原因,你的應用應該提供至少一個實作了exceptionCaught()的handler。

除了ChannelInboundHandlerAdapter,還有許多其他ChannelHandler子類和實作可以學習。ChannelHandlers被不同類型的events調用

應用程式通過實作或者擴充ChannelHandlers來鈎挂到event的生命周期,并且提供定制的應用邏輯在結構上,ChannelHandlers解耦你的業務邏輯和網絡代碼。這會簡化開發過程,因為代碼會随着需求的變化而變化。

Bootstrapping伺服器:

綁定到一個端口,伺服器在這個端口上監聽并且接收新的連接配接請求

配置Channels,來通知EchoServerHandler執行個體收到的消息

傳輸:傳輸層用來提供端對端或者主機對主機通信的服務。網際網路通信是建立在TCP傳輸的基礎上的。NIO傳輸(NIO transport)指的是一個類似于TCP傳輸的方式,不過它伺服器端的性能增強由Java NIO的實作帶來的。

EchoServerHandler實作業務邏輯

main()方法啟動(bootstrap)伺服器

以下是Bootstrapping中的必需步驟:

建立一個ServerBootstrap執行個體來啟動和綁定伺服器

建立并且配置設定一個NioEventLoopgroup執行個體來處理event,比如接受新的連接配接和讀/寫資料

指定本地InetSocketAddress到伺服器綁定的端口

用一個EchoServerHandler執行個體來初始化每個新的Channel

調用ServerBootstrap.bind()來綁定伺服器。

連接配接到伺服器

送出一條或者多條消息

對每條消息,等待并且從伺服器收回一條同樣的消息

關閉連接配接

和伺服器一樣,用戶端會有一個ChannelInboundHandler來處理資料。擴充SimpleChannelInbondHandler類來處理所有的任務。

channelActive()—和伺服器的連接配接建立起來後被調用

channelRead0()—從伺服器收到一條消息時被調用

exceptionCaught()—處理過程中異常發生時被調用

SimpleChannelInboundHandler對比ChannelInboundHandler

bootstrapping一個用戶端和bootstrapping一個伺服器類似,不同于伺服器綁定到一個監聽端口,用戶端用主機和端口參數來連接配接到一個遠端位址,這裡就是指Echo伺服器.跟之前一樣,使用的是NIO傳輸方式。注意,你在用戶端和伺服器中可以用不同的傳輸方式;比如,伺服器端用NIO,在用戶端用OIO。在第四章我們會分析一些因素和情景,讓你為一個特定的使用案例選擇一個特定傳輸方式。建立一個Bootstrap執行個體來初始化用戶端

配置設定一個NioEventLoopgroup執行個體來處理事件,包括建立新的連接配接和處理輸入輸出資料

建立一個InetSocketAddress用于連接配接到伺服器

當連接配接建立,一個EchoClientHandler會被裝入pipeline

所有東西都建立完畢後,調用Bootstrap.connet()連接配接到遠端。

完成用戶端開發後,你可以接着編譯和測試這個系統。