- 浏览: 950648 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
MINA TCP简单通信实例:http://donald-draper.iteye.com/blog/2375297
MINA 编解码器实例:http://donald-draper.iteye.com/blog/2375317
MINA 多路分离解码器实例:http://donald-draper.iteye.com/blog/2375324
在前面的文章中,我们建立服务端时都有下面几句:
今天我们来看一下SocketSessionConfig是什么,以及它的作用:
//NioSocketAcceptor
//AbstractPollingIoAcceptor
//AbstractPollingIoAcceptor
//AbstractIoAcceptor
//AbstractIoService
从上面可以看出NioSocketAcceptor构造是传输入的DefaultSocketSessionConfig参数实际上是初始化AbstractIoService的会话配置选项sessionConfig(IoSessionConfig);
来看DefaultSocketSessionConfig继承树
下面我们以IoSessionConfig->AbstractIoSessionConfig->SocketSessionConfig->
AbstractSocketSessionConfig->DefaultSocketSessionConfig
顺序来看DefaultSocketSessionConfig:
//IoSessionConfig
//IdleStatus
从上面来看会话配置IoSessionConfig主要是配置IoProcessor每次读操作分配的buffer的容量,一般情况下,不用手动设置这个属性,因为IoProcessor经常会自动调整;设置空闲状态IdleStatus(READER_IDLE,WRITER_IDLE 或 BOTH_IDLE)的空闲时间;UseReadOperation配置项用于优化客户端的读取操作,开启这个选项对服务器应用无效,并可能引起内存泄漏,因此默认为关闭状态。
再来看AbstractIoSessionConfig
再来看SocketSessionConfig
从SocketSessionConfig的方法定义来看,SocketSessionConfig主要是配置Socket,这些属性在java.net.Socket中都可以找到相似或类似的属性。
再来看AbstractSocketSessionConfig
再来看DefaultSocketSessionConfig
DefaultSocketSessionConfig构造时,发送和接受缓存区默认为-1,所以在创建NioSocketAcceptor要配置发送和接收缓存区大小;DefaultSocketSessionConfig关联一个parent父对象IoService,即配置的依附对象。#init方法初始化的parent父对象IoService,如果parent父对象为IoService(SocketAcceptor),则地址默认可重用,否则不可。
总结:
NioSocketAcceptor构造是传输入的DefaultSocketSessionConfig参数实际上是初始化AbstractIoService的会话配置选项sessionConfig(IoSessionConfig)。会话配置IoSessionConfig主要是配置IoProcessor每次读操作分配的buffer的容量,一般情况下,
不用手动设置这个属性,因为IoProcessor经常会自动调整;设置空闲状态IdleStatus(READER_IDLE,WRITER_IDLE 或 BOTH_IDLE)的空闲时间;UseReadOperation配置项用于优化客户端的读取操作,开启这个选项对服务器应用无效,并可能引起内存泄漏,因此默认为关闭状态。SocketSessionConfig主要是配置Socket,这些属性在java.net.Socket中都可以找到相似或类似的属性,比如发送缓冲区大小,是否保活,地址是否可重用等。
从AbstractSocketSessionConfig来看SocketSessionConfig的发送、接收缓冲区大小,是否保活,地址是否可重用等配置默认为true。DefaultSocketSessionConfig构造时,发送和接受缓存区默认为-1,所以在创建NioSocketAcceptor要配置发送和接收缓存区大小;
DefaultSocketSessionConfig关联一个parent父对象IoService,即配置的依附对象。#init方法初始化的parent父对象IoService,如果parent父对象为IoService(SocketAcceptor),
则地址默认可重用,否则不可。
符:
//AbstractIoSessionConfig
MINA 编解码器实例:http://donald-draper.iteye.com/blog/2375317
MINA 多路分离解码器实例:http://donald-draper.iteye.com/blog/2375324
在前面的文章中,我们建立服务端时都有下面几句:
IoAcceptor acceptor=new NioSocketAcceptor(); //配置socket会话 SocketSessionConfig socketSessionConfig = (SocketSessionConfig) acceptor.getSessionConfig(); socketSessionConfig.setReadBufferSize(readBufferSize); socketSessionConfig.setIdleTime(IdleStatus.BOTH_IDLE,idleTime);
今天我们来看一下SocketSessionConfig是什么,以及它的作用:
//NioSocketAcceptor
public NioSocketAcceptor() { super(new DefaultSocketSessionConfig(), org/apache/mina/transport/socket/nio/NioProcessor); selectorProvider = null; ((DefaultSocketSessionConfig)getSessionConfig()).init(this); }
//AbstractPollingIoAcceptor
protected AbstractPollingIoAcceptor(IoSessionConfig sessionConfig, Class processorClass) { this(sessionConfig, null, ((IoProcessor) (new SimpleIoProcessorPool(processorClass))), true, null); }
//AbstractPollingIoAcceptor
private AbstractPollingIoAcceptor(IoSessionConfig sessionConfig, Executor executor, IoProcessor processor, boolean createdProcessor, SelectorProvider selectorProvider) { super(sessionConfig, executor); ... }
//AbstractIoAcceptor
protected AbstractIoAcceptor(IoSessionConfig sessionConfig, Executor executor) { super(sessionConfig, executor); ... }
//AbstractIoService
public abstract class AbstractIoService implements IoService { private static final AtomicInteger id = new AtomicInteger(); private final String threadName; private final Executor executor;//线程池执行器 private final boolean createdExecutor;//是否创建了线程池 private IoHandler handler;//Io处理器 protected final IoSessionConfig sessionConfig;//Io会话配置 //Io服务监听器,这里默认创建一个内部的IoServiceListener,则个我们在后面再看 private final IoServiceListener serviceActivationListener = new IoServiceListener() { ... } private IoFilterChainBuilder filterChainBuilder;//过滤器链 private IoSessionDataStructureFactory sessionDataStructureFactory;//会话属性管理器 private final IoServiceListenerSupport listeners = new IoServiceListenerSupport(this); protected final Object disposalLock = new Object(); private volatile boolean disposing; private volatile boolean disposed; private IoServiceStatistics stats; //上面的变量只是暂时的理解,如果以后发现错误,在更正 protected AbstractIoService(IoSessionConfig sessionConfig, Executor executor) { ... filterChainBuilder = new DefaultIoFilterChainBuilder();//默认过滤器链构建器 listeners.add(serviceActivationListener); this.sessionConfig = sessionConfig;//初始化Session配置 ExceptionMonitor.getInstance(); if(executor == null) { //如果执行器为null,通过执行器Executors,创建一个CachedThreadPool this.executor = Executors.newCachedThreadPool(); createdExecutor = true; } else { this.executor = executor; createdExecutor = false; } ... } }
从上面可以看出NioSocketAcceptor构造是传输入的DefaultSocketSessionConfig参数实际上是初始化AbstractIoService的会话配置选项sessionConfig(IoSessionConfig);
来看DefaultSocketSessionConfig继承树
//DefaultSocketSessionConfig public class DefaultSocketSessionConfig extends AbstractSocketSessionConfig //AbstractSocketSessionConfig public abstract class AbstractSocketSessionConfig extends AbstractIoSessionConfig implements SocketSessionConfig //AbstractIoSessionConfig public abstract class AbstractIoSessionConfig implements IoSessionConfig //SocketSessionConfig public interface SocketSessionConfig extends IoSessionConfig
下面我们以IoSessionConfig->AbstractIoSessionConfig->SocketSessionConfig->
AbstractSocketSessionConfig->DefaultSocketSessionConfig
顺序来看DefaultSocketSessionConfig:
//IoSessionConfig
public interface IoSessionConfig { public abstract int getReadBufferSize(); /*设置IoProcessor每次读操作分配的buffer的容量。一般情况下,不用手动设置这个属性,因为 IoProcessor经常会自动调整。*/ public abstract void setReadBufferSize(int i); public abstract int getMinReadBufferSize(); /*设置IoProcessor每次读操作分配的buffer的最小容量,IoProcessor自动调用不能小于这个值*/ public abstract void setMinReadBufferSize(int i); public abstract int getMaxReadBufferSize(); /*设置IoProcessor每次读操作分配的buffer的最大容量,IoProcessor自动调用不能大于这个值*/ public abstract void setMaxReadBufferSize(int i); public abstract int getThroughputCalculationInterval(); public abstract long getThroughputCalculationIntervalInMillis(); /*设置每次吞吐量计算的间隔,默认为3秒*/ public abstract void setThroughputCalculationInterval(int i); public abstract int getIdleTime(IdleStatus idlestatus); public abstract long getIdleTimeInMillis(IdleStatus idlestatus); /*设置空闲状态IdleStatus(READER_IDLE, WRITER_IDLE 或 BOTH_IDLE)的空闲时间*/ public abstract void setIdleTime(IdleStatus idlestatus, int i); public abstract int getReaderIdleTime(); public abstract long getReaderIdleTimeInMillis(); /*设置空闲状态READER_IDLE的空闲时间*/ public abstract void setReaderIdleTime(int i); public abstract int getWriterIdleTime(); public abstract long getWriterIdleTimeInMillis(); /*设置空闲状态WRITER_IDLE的空闲时间*/ public abstract void setWriterIdleTime(int i); public abstract int getBothIdleTime(); public abstract long getBothIdleTimeInMillis(); /*设置空闲状态BOTH_IDLE的空闲时间*/ public abstract void setBothIdleTime(int i); public abstract int getWriteTimeout(); public abstract long getWriteTimeoutInMillis(); /*设置写超时时间*/ public abstract void setWriteTimeout(int i); public abstract boolean isUseReadOperation(); /*Enables or disabled IoSession.read() operation. If enabled, all received messages are stored in an internal BlockingQueue so you can read received messages in more convenient way for client applications. Enabling this option is not useful to server applications and can cause unintended memory leak, and therefore it's disabled by default. 开启或关闭会话读操作。如果开启,所有接收到的消息将会存储在内存的BlockingQueue中,使客户端应用可以更 便利地读取接收的消息。开启这个选项对服务器应用无效,并可能引起内存泄漏,因此默认为 关闭状态。 */ public abstract void setUseReadOperation(boolean flag); /*拷贝iosessionconfig所有会话配置到当前会话*/ public abstract void setAll(IoSessionConfig iosessionconfig); }
//IdleStatus
public class IdleStatus { private IdleStatus(String strValue) { this.strValue = strValue; } public String toString() { return strValue; } //读空闲,写空闲,读写空闲状态 public static final IdleStatus READER_IDLE = new IdleStatus("reader idle"); public static final IdleStatus WRITER_IDLE = new IdleStatus("writer idle"); public static final IdleStatus BOTH_IDLE = new IdleStatus("both idle"); private final String strValue; }
从上面来看会话配置IoSessionConfig主要是配置IoProcessor每次读操作分配的buffer的容量,一般情况下,不用手动设置这个属性,因为IoProcessor经常会自动调整;设置空闲状态IdleStatus(READER_IDLE,WRITER_IDLE 或 BOTH_IDLE)的空闲时间;UseReadOperation配置项用于优化客户端的读取操作,开启这个选项对服务器应用无效,并可能引起内存泄漏,因此默认为关闭状态。
再来看AbstractIoSessionConfig
public abstract class AbstractIoSessionConfig implements IoSessionConfig { //这些变量,我们这里不用再说了,在IoSessionConfig已看过 private int minReadBufferSize; private int readBufferSize; private int maxReadBufferSize; private int idleTimeForRead; private int idleTimeForWrite; private int idleTimeForBoth; private int writeTimeout; private boolean useReadOperation; private int throughputCalculationInterval; protected AbstractIoSessionConfig() { minReadBufferSize = 64;//2^6 readBufferSize = 2048; maxReadBufferSize = 65536;//2^32 writeTimeout = 60;//默认写超时时间为60秒 throughputCalculationInterval = 3; } //copy会话配置 public void setAll(IoSessionConfig config) { if(config == null) { throw new IllegalArgumentException("config"); } else { setReadBufferSize(config.getReadBufferSize()); setMinReadBufferSize(config.getMinReadBufferSize()); setMaxReadBufferSize(config.getMaxReadBufferSize()); setIdleTime(IdleStatus.BOTH_IDLE, config.getIdleTime(IdleStatus.BOTH_IDLE)); setIdleTime(IdleStatus.READER_IDLE, config.getIdleTime(IdleStatus.READER_IDLE)); setIdleTime(IdleStatus.WRITER_IDLE, config.getIdleTime(IdleStatus.WRITER_IDLE)); setWriteTimeout(config.getWriteTimeout()); setUseReadOperation(config.isUseReadOperation()); setThroughputCalculationInterval(config.getThroughputCalculationInterval()); return; } } //读buffer配置 public int getReadBufferSize() { return readBufferSize; } public void setReadBufferSize(int readBufferSize) { if(readBufferSize <= 0) { throw new IllegalArgumentException((new StringBuilder()).append("readBufferSize: ").append(readBufferSize).append(" (expected: 1+)").toString()); } else { this.readBufferSize = readBufferSize; return; } } //这些方法没有什么好说的,看看就明白 public int getIdleTime(IdleStatus status) { if(status == IdleStatus.BOTH_IDLE) return idleTimeForBoth; if(status == IdleStatus.READER_IDLE) return idleTimeForRead; if(status == IdleStatus.WRITER_IDLE) return idleTimeForWrite; else throw new IllegalArgumentException((new StringBuilder()).append("Unknown idle status: ").append(status).toString()); } public long getIdleTimeInMillis(IdleStatus status) { return (long)getIdleTime(status) * 1000L; } public void setIdleTime(IdleStatus status, int idleTime) { if(idleTime < 0) throw new IllegalArgumentException((new StringBuilder()).append("Illegal idle time: ").append(idleTime).toString()); if(status == IdleStatus.BOTH_IDLE) idleTimeForBoth = idleTime; else if(status == IdleStatus.READER_IDLE) idleTimeForRead = idleTime; else if(status == IdleStatus.WRITER_IDLE) idleTimeForWrite = idleTime; else throw new IllegalArgumentException((new StringBuilder()).append("Unknown idle status: ").append(status).toString()); } //其他的属性配置与上面的方法类似,就不再说了 ... }
再来看SocketSessionConfig
public interface SocketSessionConfig extends IoSessionConfig { public abstract boolean isReuseAddress(); public abstract void setReuseAddress(boolean flag); public abstract int getReceiveBufferSize(); public abstract void setReceiveBufferSize(int i); public abstract int getSendBufferSize(); public abstract void setSendBufferSize(int i); public abstract int getTrafficClass(); public abstract void setTrafficClass(int i); public abstract boolean isKeepAlive(); public abstract void setKeepAlive(boolean flag); public abstract boolean isOobInline(); public abstract void setOobInline(boolean flag); public abstract int getSoLinger(); public abstract void setSoLinger(int i);//设置当socket输出流中还有输出没发送完,延迟关闭socket的时间 public abstract boolean isTcpNoDelay(); public abstract void setTcpNoDelay(boolean flag); }
从SocketSessionConfig的方法定义来看,SocketSessionConfig主要是配置Socket,这些属性在java.net.Socket中都可以找到相似或类似的属性。
再来看AbstractSocketSessionConfig
public abstract class AbstractSocketSessionConfig extends AbstractIoSessionConfig implements SocketSessionConfig { public AbstractSocketSessionConfig() { } public void setAll(IoSessionConfig config) { super.setAll(config); if(!(config instanceof SocketSessionConfig)) return; if(config instanceof AbstractSocketSessionConfig) { AbstractSocketSessionConfig cfg = (AbstractSocketSessionConfig)config; if(cfg.isKeepAliveChanged()) setKeepAlive(cfg.isKeepAlive()); if(cfg.isOobInlineChanged()) setOobInline(cfg.isOobInline()); if(cfg.isReceiveBufferSizeChanged()) setReceiveBufferSize(cfg.getReceiveBufferSize()); if(cfg.isReuseAddressChanged()) setReuseAddress(cfg.isReuseAddress()); if(cfg.isSendBufferSizeChanged()) setSendBufferSize(cfg.getSendBufferSize()); if(cfg.isSoLingerChanged()) setSoLinger(cfg.getSoLinger()); if(cfg.isTcpNoDelayChanged()) setTcpNoDelay(cfg.isTcpNoDelay()); if(cfg.isTrafficClassChanged() && getTrafficClass() != cfg.getTrafficClass()) setTrafficClass(cfg.getTrafficClass()); } else { SocketSessionConfig cfg = (SocketSessionConfig)config; setKeepAlive(cfg.isKeepAlive()); setOobInline(cfg.isOobInline()); setReceiveBufferSize(cfg.getReceiveBufferSize()); setReuseAddress(cfg.isReuseAddress()); setSendBufferSize(cfg.getSendBufferSize()); setSoLinger(cfg.getSoLinger()); setTcpNoDelay(cfg.isTcpNoDelay()); if(getTrafficClass() != cfg.getTrafficClass()) setTrafficClass(cfg.getTrafficClass()); } } protected boolean isKeepAliveChanged() { return true; } protected boolean isOobInlineChanged() { return true; } protected boolean isReceiveBufferSizeChanged() { return true; } protected boolean isReuseAddressChanged() { return true; } protected boolean isSendBufferSizeChanged() { return true; } protected boolean isSoLingerChanged() { return true; } protected boolean isTcpNoDelayChanged() { return true; } protected boolean isTrafficClassChanged() { return true; } }
再来看DefaultSocketSessionConfig
public class DefaultSocketSessionConfig extends AbstractSocketSessionConfig { private static final boolean DEFAULT_REUSE_ADDRESS = false; private static final int DEFAULT_TRAFFIC_CLASS = 0; private static final boolean DEFAULT_KEEP_ALIVE = false; private static final boolean DEFAULT_OOB_INLINE = false; private static final int DEFAULT_SO_LINGER = -1; private static final boolean DEFAULT_TCP_NO_DELAY = false; protected IoService parent;//父对象,即谁拥有当前的SocketSessionConfig配置 //下面为SocketSessionConfig方法相关的属性 //发送、接收缓冲区大小,是否保活,地址是否可重用 private boolean defaultReuseAddress; private boolean reuseAddress; private int receiveBufferSize; private int sendBufferSize; private int trafficClass; private boolean keepAlive; private boolean oobInline; private int soLinger;//当socket输出流中还有输出没发送完,延迟关闭socket的时间 private boolean tcpNoDelay; public DefaultSocketSessionConfig() { //发送和接受缓存区默认为-1,这就是要设置NioSocketAcceptor发送和接收缓存区大小原因 receiveBufferSize = -1; sendBufferSize = -1; trafficClass = 0; keepAlive = false; oobInline = false; soLinger = -1; tcpNoDelay = false; } //初始化SocketSessionConfig配置的父对象IoService, public void init(IoService parent) { this.parent = parent; //如果父对象为IoService(SocketAcceptor),则地址默认可重用,否则不可 if(parent instanceof SocketAcceptor) defaultReuseAddress = true; else defaultReuseAddress = false; reuseAddress = defaultReuseAddress; } //下面这些没有什么好讲的,看看就行 public boolean isReuseAddress() { return reuseAddress; } public void setReuseAddress(boolean reuseAddress) { this.reuseAddress = reuseAddress; } public int getReceiveBufferSize() { return receiveBufferSize; } public void setReceiveBufferSize(int receiveBufferSize) { this.receiveBufferSize = receiveBufferSize; } public int getSendBufferSize() { return sendBufferSize; } public void setSendBufferSize(int sendBufferSize) { this.sendBufferSize = sendBufferSize; } public int getTrafficClass() { return trafficClass; } public void setTrafficClass(int trafficClass) { this.trafficClass = trafficClass; } public boolean isKeepAlive() { return keepAlive; } public void setKeepAlive(boolean keepAlive) { this.keepAlive = keepAlive; } public boolean isOobInline() { return oobInline; } public void setOobInline(boolean oobInline) { this.oobInline = oobInline; } public int getSoLinger() { return soLinger; } public void setSoLinger(int soLinger) { this.soLinger = soLinger; } public boolean isTcpNoDelay() { return tcpNoDelay; } public void setTcpNoDelay(boolean tcpNoDelay) { this.tcpNoDelay = tcpNoDelay; } protected boolean isKeepAliveChanged() { return keepAlive; } protected boolean isOobInlineChanged() { return oobInline; } protected boolean isReceiveBufferSizeChanged() { return receiveBufferSize != -1; } protected boolean isReuseAddressChanged() { return reuseAddress != defaultReuseAddress; } protected boolean isSendBufferSizeChanged() { return sendBufferSize != -1; } protected boolean isSoLingerChanged() { return soLinger != -1; } protected boolean isTcpNoDelayChanged() { return tcpNoDelay; } protected boolean isTrafficClassChanged() { return trafficClass != 0; } }
DefaultSocketSessionConfig构造时,发送和接受缓存区默认为-1,所以在创建NioSocketAcceptor要配置发送和接收缓存区大小;DefaultSocketSessionConfig关联一个parent父对象IoService,即配置的依附对象。#init方法初始化的parent父对象IoService,如果parent父对象为IoService(SocketAcceptor),则地址默认可重用,否则不可。
总结:
NioSocketAcceptor构造是传输入的DefaultSocketSessionConfig参数实际上是初始化AbstractIoService的会话配置选项sessionConfig(IoSessionConfig)。会话配置IoSessionConfig主要是配置IoProcessor每次读操作分配的buffer的容量,一般情况下,
不用手动设置这个属性,因为IoProcessor经常会自动调整;设置空闲状态IdleStatus(READER_IDLE,WRITER_IDLE 或 BOTH_IDLE)的空闲时间;UseReadOperation配置项用于优化客户端的读取操作,开启这个选项对服务器应用无效,并可能引起内存泄漏,因此默认为关闭状态。SocketSessionConfig主要是配置Socket,这些属性在java.net.Socket中都可以找到相似或类似的属性,比如发送缓冲区大小,是否保活,地址是否可重用等。
从AbstractSocketSessionConfig来看SocketSessionConfig的发送、接收缓冲区大小,是否保活,地址是否可重用等配置默认为true。DefaultSocketSessionConfig构造时,发送和接受缓存区默认为-1,所以在创建NioSocketAcceptor要配置发送和接收缓存区大小;
DefaultSocketSessionConfig关联一个parent父对象IoService,即配置的依附对象。#init方法初始化的parent父对象IoService,如果parent父对象为IoService(SocketAcceptor),
则地址默认可重用,否则不可。
符:
//AbstractIoSessionConfig
public abstract class AbstractIoSessionConfig implements IoSessionConfig { //这里不上AbstractIoSessionConfig的剩余方法 ... public final int getBothIdleTime() { return getIdleTime(IdleStatus.BOTH_IDLE); } public final long getBothIdleTimeInMillis() { return getIdleTimeInMillis(IdleStatus.BOTH_IDLE); } public final int getReaderIdleTime() { return getIdleTime(IdleStatus.READER_IDLE); } public final long getReaderIdleTimeInMillis() { return getIdleTimeInMillis(IdleStatus.READER_IDLE); } public final int getWriterIdleTime() { return getIdleTime(IdleStatus.WRITER_IDLE); } public final long getWriterIdleTimeInMillis() { return getIdleTimeInMillis(IdleStatus.WRITER_IDLE); } public void setBothIdleTime(int idleTime) { setIdleTime(IdleStatus.BOTH_IDLE, idleTime); } public void setReaderIdleTime(int idleTime) { setIdleTime(IdleStatus.READER_IDLE, idleTime); } public void setWriterIdleTime(int idleTime) { setIdleTime(IdleStatus.WRITER_IDLE, idleTime); } public int getWriteTimeout() { return writeTimeout; } public long getWriteTimeoutInMillis() { return (long)writeTimeout * 1000L; } public void setWriteTimeout(int writeTimeout) { if(writeTimeout < 0) { throw new IllegalArgumentException((new StringBuilder()).append("Illegal write timeout: ").append(writeTimeout).toString()); } else { this.writeTimeout = writeTimeout; return; } } public boolean isUseReadOperation() { return useReadOperation; } public void setUseReadOperation(boolean useReadOperation) { this.useReadOperation = useReadOperation; } public int getThroughputCalculationInterval() { return throughputCalculationInterval; } public void setThroughputCalculationInterval(int throughputCalculationInterval) { if(throughputCalculationInterval < 0) { throw new IllegalArgumentException((new StringBuilder()).append("throughputCalculationInterval: ").append(throughputCalculationInterval).toString()); } else { this.throughputCalculationInterval = throughputCalculationInterval; return; } } public long getThroughputCalculationIntervalInMillis() { return (long)throughputCalculationInterval * 1000L; } }
发表评论
-
Mina 报文连接器(NioDatagramConnector)
2017-06-14 08:46 1339Mina 抽象Polling连接器(A ... -
Mina 报文监听器NioDatagramAcceptor二(发送会话消息等)
2017-06-13 16:01 1488Mina 报文监听器NioDatagramAcceptor一( ... -
Mina 报文监听器NioDatagramAcceptor一(初始化,Io处理器)
2017-06-13 09:51 2502Mina Io监听器接口定义及抽象实现:http://dona ... -
Mina 报文通信简单示例
2017-06-12 09:01 2484MINA TCP简单通信实例:http://donald-dr ... -
Mina socket连接器(NioSocketConnector)
2017-06-12 08:37 4640Mina 抽象Polling连接器(AbstractPolli ... -
Mina 抽象Polling连接器(AbstractPollingIoConnector)
2017-06-11 21:29 960Mina 连接器接口定义及抽象实现(IoConnector ) ... -
Mina 连接器接口定义及抽象实现(IoConnector )
2017-06-11 13:46 1770Mina IoService接口定义及抽象实现:http:// ... -
Mina socket监听器(NioSocketAcceptor)
2017-06-09 08:44 3336Mina IoService接口定义及抽象实现:http:// ... -
Mina 抽象polling监听器
2017-06-08 22:32 708Mina Io监听器接口定义及抽象实现:http://dona ... -
Mina Io监听器接口定义及抽象实现
2017-06-07 13:02 1296Mina IoService接口定义及抽象实现:http:// ... -
Mina IoService接口定义及抽象实现
2017-06-06 23:44 1127Mina IoHandler接口定义:http://donal ... -
Mina Nio会话(Socket,DataGram)
2017-06-06 12:53 1144Mina Socket会话配置:http://donald-d ... -
Mina 抽象Io会话
2017-06-05 22:45 968Mina Io会话接口定义:http://donald-dra ... -
Mina Io会话接口定义
2017-06-04 23:15 1094Mina Nio处理器:http://donald-drape ... -
Mina Nio处理器
2017-06-04 22:19 692Mina Io处理器抽象实现:http://donald-dr ... -
Mina Io处理器抽象实现
2017-06-03 23:52 1082Mina 过滤链抽象实现:http://donald-drap ... -
Mina IoHandler接口定义
2017-06-01 21:30 1670Mina 过滤链抽象实现:http://donald-drap ... -
MINA 多路复用协议编解码器工厂二(多路复用协议解码器)
2017-06-01 12:52 2193MINA 多路复用协议编解码器工厂一(多路复用协议编码器): ... -
MINA 多路复用协议编解码器工厂一(多路复用协议编码器)
2017-05-31 22:22 1790MINA 多路分离解码器实例:http://donald-dr ... -
Mina 累计协议解码器
2017-05-31 00:09 1155MINA 编解码器实例:http://donald-drape ...
相关推荐
本库是对我在项目中使用的Mina和长连接的一个封装,亲测有效,在网络良好的情况下,几乎能够保证100%的连接和通讯;
mina socket 的一个简单示例!
java mina 服务端,socket客服端传信息,客服端上传消息
通过Mina与Socket实现通信,其包含客户端与服务端的实现代码
Apache mina socket通信源代码,版本为2.0.7
1.mina socket客户度工程相关类,添加mina jar包后可独立运行。 2.mina若有空闲连接则使用已有连接,若无则新建mina连接; 3.mina空闲连接超过保活时间25分钟后,自动删除; 4.mina发送指令后,接收指定时长内收到的...
mina简单示例,Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速...
mina测试框架 mina测试框架 mina测试框架
Apache MINA 线程模型配置 Mina配置
mina框架中socket使用,有服务端和客户端。这是比较完整的项目。希望能给后人点参考
mina socket 代码
是跟手机进行推送功能的时候整理的工具,有长连接也有socket短连接,代码能直接运行,jar包和代码都有 直接放到项目里可以用,有mian测试方法
java客户端socket与mina服务端通信,保持长连接
集成框架SpringBoot+myBatis+Mina,内附CRC校验工具类和进制转换工具类 SpringBoot集成Socket通讯之Mina框架
mina 包 socket 框架
socket的tcp/udp(多播) nio的tcp/udp mina 均有服务端/客服端
androidpn项目基础,socket和mina,详情见博客http://blog.csdn.net/specialshoot/article/details/50678374
NULL 博文链接:https://ginge.iteye.com/blog/363178
mina带心跳长链接,可实现服务间通信。socket长连接实现客户端与服务端的通信。对于通信技术学习是非常好的资料。改造后可实现企业应用
Socket与mina交互,如果熟悉了解码协议,其他的就OK了。