
同時連到一個伺服器的多個用戶端。理論上,可支援的用戶端數量是受可支配系統資源限制的(以及在用的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()連接配接到遠端。
完成用戶端開發後,你可以接着編譯和測試這個系統。