服務器的引導共用了客戶端引導的一些邏輯。
### [](https://github.com/waylau/essential-netty-in-action/blob/master/CORE%20FUNCTIONS/Bootstrapping%20servers.md#引導服務器的方法)引導服務器的方法
下表顯示了 ServerBootstrap 的方法
Table 9.2 Methods of ServerBootstrap‘
| 名稱 | 描述 |
| --- | --- |
| group | 設置 EventLoopGroup 用于 ServerBootstrap。這個 EventLoopGroup 提供 ServerChannel 的 I/O 并且接收 Channel |
| channel channelFactory | channel() 指定 Channel 的實現類。如果管道沒有提供一個默認的構造函數,你可以提供一個 ChannelFactory。 |
| localAddress | 指定 ServerChannel 實例化的類。如果不提供,將由操作系統創建一個隨機的。或者,您可以使用 bind() 或 connect()指定localAddress |
| option | 指定一個 ChannelOption 來用于新創建的 ServerChannel 的 ChannelConfig 。這些選項將被設置在管道的 bind() 或 connect(),這取決于誰首先被調用。在此調用這些方法之后設置或更改 ChannelOption 是無效的。所支持 ChannelOption 取決于使用的管道類型。請參考9.6節和 ChannelConfig 的 API 文檔 的 Channel 類型使用。 |
| childOption | 當管道已被接受,指定一個 ChannelOption 應用于 Channel 的 ChannelConfig。 |
| attr | 指定 ServerChannel 的屬性。這些屬性可以被 管道的 bind() 設置。當調用 bind() 之后,修改它們不會生效。 |
| childAttr | 應用屬性到接收到的管道上。后續調用沒有效果。 |
| handler | 設置添加到 ServerChannel 的 ChannelPipeline 中的 ChannelHandler。 具體詳見 childHandler() 描述 |
| childHandler | 設置添加到接收到的 Channel 的 ChannelPipeline 中的 ChannelHandler。handler() 和 childHandler()之間的區別是前者是接收和處理ServerChannel,同時 childHandler() 添加處理器用于處理和接收 Channel。后者代表一個套接字綁定到一個遠端。 |
| clone | 克隆 ServerBootstrap 用于連接到不同的遠端,通過設置相同的原始 ServerBoostrap。 |
| bind | 綁定 ServerChannel 并且返回一個 ChannelFuture,用于 通知連接操作完成了(結果可以是成功或者失敗) |
### [](https://github.com/waylau/essential-netty-in-action/blob/master/CORE%20FUNCTIONS/Bootstrapping%20servers.md#如何引導一個服務器)如何引導一個服務器
ServerBootstrap 中的 childHandler(), childAttr() 和 childOption() 是常用的服務器應用的操作。具體來說,ServerChannel實現負責創建子 Channel,它代表接受連接。因此 引導 ServerChannel 的 ServerBootstrap ,提供這些方法來簡化接收的 Channel 對 ChannelConfig 應用設置的任務。
圖9.3顯示了 ServerChannel 創建 ServerBootstrap 在 bind(),后者管理大量的子 Channel。
[](https://github.com/waylau/essential-netty-in-action/blob/master/images/Figure%209.3%20ServerBootstrap.jpg)
1. 當調用 bind() 后 ServerBootstrap 將創建一個新的管道,這個管道將會在綁定成功后接收子管道
2. 接收新連接給每個子管道
3. 接收連接的 Channel
Figure 9.3 ServerBootstrap
記住 child* 的方法都是操作在子的 Channel,被 ServerChannel 管理。
清單9.4 ServerBootstrap 時會創建一個 NioServerSocketChannel實例 bind() 。這個 NioServerChannel 負責接受新連接和創建NioSocketChannel 實例。
Listing 9.4 Bootstrapping a server
~~~
NioEventLoopGroup group = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap(); //1
bootstrap.group(group) //2
.channel(NioServerSocketChannel.class) //3
.childHandler(new SimpleChannelInboundHandler<ByteBuf>() { //4
@Override
protected void channelRead0(ChannelHandlerContext ctx,
ByteBuf byteBuf) throws Exception {
System.out.println("Reveived data");
byteBuf.clear();
}
}
);
ChannelFuture future = bootstrap.bind(new InetSocketAddress(8080)); //5
future.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture channelFuture)
throws Exception {
if (channelFuture.isSuccess()) {
System.out.println("Server bound");
} else {
System.err.println("Bound attempt failed");
channelFuture.cause().printStackTrace();
}
}
}
);
~~~
1. 創建要給新的 ServerBootstrap 來創建新的 SocketChannel 管道并綁定他們
2. 指定 EventLoopGroup 用于從注冊的 ServerChannel 中獲取EventLoop 和接收到的管道
3. 指定要使用的管道類
4. 設置子處理器用于處理接收的管道的 I/O 和數據
5. 通過配置引導來綁定管道
- Introduction
- 開始
- Netty-異步和數據驅動
- Netty 介紹
- 構成部分
- 關于本書
- 第一個 Netty 應用
- 設置開發環境
- Netty 客戶端/服務端 總覽
- 寫一個 echo 服務器
- 寫一個 echo 客戶端
- 編譯和運行 Echo 服務器和客戶端
- 總結
- Netty 總覽
- Netty 快速入門
- Channel, Event 和 I/O
- 什么是 Bootstrapping 為什么要用
- ChannelHandler 和 ChannelPipeline
- 近距離觀察 ChannelHandler
- 總結
- 核心功能
- Transport(傳輸)
- 案例研究:Transport 的遷移
- Transport API
- 包含的 Transport
- Transport 使用情況
- 總結
- Buffer(緩沖)
- Buffer API
- ByteBuf - 字節數據的容器
- 字節級別的操作
- ByteBufHolder
- ByteBuf 分配
- 總結
- ChannelHandler 和 ChannelPipeline
- ChannelHandler 家族
- ChannelPipeline
- ChannelHandlerContext
- 總結
- Codec 框架
- 什么是 Codec
- Decoder(解碼器)
- Encoder(編碼器)
- 抽象 Codec(編解碼器)類
- 總結
- 提供了的 ChannelHandler 和 Codec
- 使用 SSL/TLS 加密 Netty 程序
- 構建 Netty HTTP/HTTPS 應用
- 空閑連接以及超時
- 解碼分隔符和基于長度的協議
- 編寫大型數據
- 序列化數據
- 總結
- Bootstrap 類型
- 引導客戶端和無連接協議
- 引導服務器
- 從 Channel 引導客戶端
- 在一個引導中添加多個 ChannelHandler
- 使用Netty 的 ChannelOption 和屬性
- 關閉之前已經引導的客戶端或服務器
- 總結
- 引導
- Bootstrap 類型
- 引導客戶端和無連接協議
- 引導服務器
- 從 Channel 引導客戶端
- 在一個引導中添加多個 ChannelHandler
- 使用Netty 的 ChannelOption 和屬性
- 關閉之前已經引導的客戶端或服務器
- 總結
- NETTY BY EXAMPLE
- 單元測試
- 總覽
- 測試 ChannelHandler
- 測試異常處理
- 總結
- WebSocket
- WebSocket 程序示例
- 添加 WebSocket 支持
- 測試程序
- 總結
- SPDY
- SPDY 背景
- 示例程序
- 實現
- 啟動 SpdyServer 并測試
- 總結
- 通過 UDP 廣播事件
- UDP 基礎
- UDP 廣播
- UDP 示例
- EventLog 的 POJO
- 寫廣播器
- 寫監視器
- 運行 LogEventBroadcaster 和 LogEventMonitor
- 總結
- 高級主題
- 實現自定義的編解碼器
- 編解碼器的范圍
- 實現 Memcached 編解碼器
- 了解 Memcached 二進制協議
- Netty 編碼器和解碼器
- 測試編解碼器
- EventLoop 和線程模型
- 線程模型的總覽
- EventLoop
- EventLoop
- I/O EventLoop/Thread 分配細節
- 總結
- 用例1:Droplr Firebase 和 Urban Airship
- 用例2:Facebook 和 Twitter