本文主要是对前一节(Netty多线程机制)中的一些未提及的有用的类(可控制可配置类)做进一步解释说明,由于NIO包和OIO包中类比较多,此文仅介绍与多线程相关的且有对外开放接口的类进行分析。
NIO包结构如下图所示:
本文档主要讲解此包中的
DefaultNioDatagramChannelConfig类、
NioDatagramChannelConfig接口、
NioSocketChannelConfig接口
OIO包结构如下图所示:
此包中的类各种功能与NIO包中的类的功能类似,只是适用于old I/O,添加了多播模式的支持。
参考源码包
以下是对类的具体说明以及重要的常用的方法的分析
DefaultNioDatagramChannelConfig
此类是接口NioDatagramChannelConfig的实现类,具体的使用方法参见3.2.NioDatagramChannelConfig接口分析
NioDatagramChannelConfig
为新的I/O(new I/O) TCP/IP协议提供数据报管道配置,主要是配置DatagramChannel的参数的。以下是一些常用的参数:
Name | Associated setter method |
"writeBufferHighWaterMark" | 默认 64 * 1024(用法未知) |
"writeBufferLowWaterMark" | 默认 32 * 1024(用法未知) |
"writeSpinCount" | 默认 16(重复写次数,用法未知) |
"broadcast" | true / false 多播模式(UDP适用) |
"interface" | |
"loopbackModeDisabled" | 实际调用的是channel.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, loopbackModeDisabled);仅针对JDK7+有效 |
"networkInterface" | 实际调用的是channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, networkInterface);仅针对JDK7+有效 |
"reuseAddress" | |
"receiveBufferSize" | 数据包接收大小 |
"receiveBufferSizePredictor" | 数据包接收大小:默认设置为FixedReceiveBufferSizePredictor(768),超过后丢弃 |
"receiveBufferSizePredictorFactory" | 似乎与上面的功能相同,设置方式:new FixedReceiveBufferSizePredictorFactory(1024) |
"sendBufferSize" | |
"timeToLive" | JDK7+版本有效 |
"trafficClass" | |
bufferFactory" | 用于创建ChannelBuffer的工厂,默认HeapChannelBufferFactory |
"connectTimeoutMillis" | |
"pipelineFactory" | 仅适用于child channel 创建时有效 |
"keepAlive" | 启用/禁用Nagle算法 |
"soLinger" | Socket关闭时的延迟时间(单位:秒) |
"tcpNoDelay" | 启用/禁用Nagle算法 |
NioSocketChannelConfig
具体配置查看3.2 NioDatagramChannelConfig
Demo实现
SocketSetver
public static void tcpServerStartUp() {
TCPSERVER_BOOTSTRAP.setPipelineFactory(new TCPServerPipelineFactory(EXECUTION_UP_HANDLER,EXECUTION_DOWN_HANDLER));
// TCPSERVER_BOOTSTRAP.setOption("child.tcpNoDelay", true);
// TCPSERVER_BOOTSTRAP.setOption("child.keepAlive", true);
// TCPSERVER_BOOTSTRAP.setOption("reuseAddress", true);
// LOGGER.info("SERVER_NAME:"+Constants.SERVER_NAME);
// LOGGER.info("TCPSERVER_PORT:"+Constants.TCPSERVER_PORT);
// TCPSERVER_BOOTSTRAP.bind(new InetSocketAddress(Constants.SERVER_NAME,Constants.TCPSERVER_PORT));
TCPSERVER_BOOTSTRAP.setOptions(Constants.CHANNEL_CONFIGER_MAP);
TCPSERVER_BOOTSTRAP.bind();
LOGGER.info("TCP服务已启动....");
Constants
CHANNEL_CONFIGER_MAP.put("writeBufferHighWaterMark", 64*1024);
CHANNEL_CONFIGER_MAP.put("writeBufferLowWaterMark", 32*1024);
CHANNEL_CONFIGER_MAP.put("writeSpinCount", 16);
CHANNEL_CONFIGER_MAP.put("broadcast", true);
CHANNEL_CONFIGER_MAP.put("interface", new InetSocketAddress(Constants.SERVER_NAME,Constants.TCPSERVER_PORT));
CHANNEL_CONFIGER_MAP.put("loopbackModeDisabled", true);
CHANNEL_CONFIGER_MAP.put("networkInterface", new InetSocketAddress(Constants.SERVER_NAME,Constants.TCPSERVER_PORT));
CHANNEL_CONFIGER_MAP.put("localAddress", new InetSocketAddress(Constants.SERVER_NAME,Constants.TCPSERVER_PORT));
CHANNEL_CONFIGER_MAP.put("reuseAddress", true);
CHANNEL_CONFIGER_MAP.put("receiveBufferSize", 10000);
CHANNEL_CONFIGER_MAP.put("receiveBufferSizePredictor", new FixedReceiveBufferSizePredictor(100000));
CHANNEL_CONFIGER_MAP.put("receiveBufferSizePredictorFactory", new FixedReceiveBufferSizePredictorFactory(100000));
CHANNEL_CONFIGER_MAP.put("sendBufferSize", 10000);
CHANNEL_CONFIGER_MAP.put("timeToLive", 30);
CHANNEL_CONFIGER_MAP.put("trafficClass", 100);
CHANNEL_CONFIGER_MAP.put("bufferFactory", new HeapChannelBufferFactory());
CHANNEL_CONFIGER_MAP.put("connectTimeoutMillis", 60000);
CHANNEL_CONFIGER_MAP.put("pipelineFactory", new TCPServerPipelineFactory(new ExecutionHandler(
new OrderedMemoryAwareThreadPoolExecutor(16, 1048576, 1048576),false,true), new ExecutionHandler(
new OrderedDownstreamThreadPoolExecutor(16),true,false)));