TCP參數設置
ChannelOption參數
Bootstrap是Netty提供的客戶端連接工具類,主要於簡化客戶端的創建。常用功能之一是TCP參數設置接口
1、SO_TIMEOUT
控制讀取操作將阻塞多少毫秒,如果返回值爲0,計時器就被禁止了,該線程將被無限期阻塞。
2、SO_SNDBUF
套接字使用的發送緩衝區大小
3、SO_RCVBUF
套接字使用的接收緩衝區大小
4、SO_REUSEADDR
是否允許重用端口。默認值與系統相關。
5、CONNECT_TIMEOUT_MILLIS
客戶端連接超時時間,原生NIO不提供該功能,Netty使用的是自定義連接超時定時器檢測和超時控制
6、TCP_NODELAY
是否使用Nagle算法,設置爲true關閉Nagle算法。
如果是時延敏感型的應用,建議關閉。
Nagle算法將小的碎片數據連接成更大的報文來最小化所發送的報文的數量。
7、SO_KEEPALIVE
是否使用TCP的心跳機制。
當設置該選項以後,如果在兩小時內沒有數據的通信時,TCP會自動發送一個活動探測數據報文。
建議:心跳機制由應用層自己實現;
Netty源碼分析- AbstractBootstrap類源碼
private final Map<ChannelOption<?>, Object> options = new LinkedHashMap();
/**
* Channel實例被創建時,指定使用的ChannelOption參數。
* value參數爲null,則移除這個ChannelOption參數
*
* Allow to specify a {@link ChannelOption} which is used for the {@link Channel}
* instances once they got created.
* Use a value of {@code null} to remove a previous set {@link ChannelOption}.
*/
public <T> B option(ChannelOption<T> option, T value) {
//判空
if (option == null) {
throw new NullPointerException("option");
} else {
if (value == null) {
//從map中移除
synchronized(this.options) {
this.options.remove(option);
}
} else {
//添加到map
synchronized(this.options) {
this.options.put(option, value);
}
}
return this.self();
}
}
Netty應用
EventLoopGroup group = new NioEventLoopGroup();
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(new LoggingHandler(LogLevel.INFO));
}
});
ChannelFuture f = b.connect(HOST, PORT).sync();
–思想–
每個人都有權利和義務去設法瞭解重要的事情