package com.lefu.remote.netty.server;
import com.lefu.remote.netty.ChannelHandlerFactory;
import com.lefu.remote.netty.AbstractChannelInitializer;
import com.lefu.remote.netty.DefaultChannelInitializer;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.ChannelOption;
/**
* 示例:默认服务端的实现
*
* <pre>
* 应用只需要覆盖 {@link IOServer#configure()},调整网络配置则覆盖 {@link IOServer#options(ServerBootstrap)},并提供 {@link ChannelHandlerFactory} 的实现类即可。
* </pre>
*
* @author jiang.li
*
*/
public class IOServer extends AbstractServerConfigure {
private ServerOptionsConfigure optionsConfigure;
private ChannelHandlerFactory handlerFactory;
private boolean useSingleton = false;
private boolean enableTimeoutHandler = false;
private boolean enableIdleHandler = true;
private int timeout = 90;
private int readIdleTime = 30;
private int writeIdleTime = 0;
private int bothIdleTime = 0;
public IOServer() {
}
public IOServer(ChannelHandlerFactory handlerFactory) {
this.handlerFactory = handlerFactory;
}
@Override
public void configure() {
if (handlerFactory == null) {
throw new NullPointerException("ChannelHandlerFactory must not be null");
}
DefaultChannelInitializer serverChannelInitializer = new DefaultChannelInitializer(
handlerFactory);
serverChannelInitializer.setUseSingleton(useSingleton);
serverChannelInitializer.setBothIdleTime(bothIdleTime);
serverChannelInitializer.setEnableIdleHandler(enableIdleHandler);
serverChannelInitializer.setEnableTimeoutHandler(enableTimeoutHandler);
serverChannelInitializer.setReadIdleTime(readIdleTime);
serverChannelInitializer.setTimeout(timeout);
serverChannelInitializer.setWriteIdleTime(writeIdleTime);
setChannelInitializer(serverChannelInitializer);
}
@Override
protected void options(ServerBootstrap bootstrap) {
// Should set pooled areas [java
// -Dio.netty.allocator.numDirectArenas=...
// -Dio.netty.allocator.numHeapArenas=...]
bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
if (optionsConfigure != null) {
optionsConfigure.options(bootstrap);
}
}
public void setHandlerFactory(ChannelHandlerFactory handlerFactory) {
this.handlerFactory = handlerFactory;
}
/**
* @see {@link DefaultChannelInitializer#setUseSingleton(boolean)}
* @param useSingleton
*/
public void setUseSingleton(boolean useSingleton) {
this.useSingleton = useSingleton;
}
/**
* @see {@link AbstractChannelInitializer#setEnableTimeoutHandler(boolean)}
* @param enableTimeoutHandler
*/
public void setEnableTimeoutHandler(boolean enableTimeoutHandler) {
this.enableTimeoutHandler = enableTimeoutHandler;
}
/**
* @see {@link AbstractChannelInitializer#setEnableIdleHandler(boolean)}
* @param enableIdleHandler
*/
public void setEnableIdleHandler(boolean enableIdleHandler) {
this.enableIdleHandler = enableIdleHandler;
}
/**
* @see {@link AbstractChannelInitializer#setTimeout(int)}
* @param timeout
*/
public void setTimeout(int timeout) {
this.timeout = timeout;
}
/**
* @see {@link AbstractChannelInitializer#setReadIdleTime(int)}
* @param readIdleTime
*/
public void setReadIdleTime(int readIdleTime) {
this.readIdleTime = readIdleTime;
}
/**
* @see {@link AbstractChannelInitializer#setWriteIdleTime(int)}
* @param writeIdleTime
*/
public void setWriteIdleTime(int writeIdleTime) {
this.writeIdleTime = writeIdleTime;
}
/**
* @see {@link AbstractChannelInitializer#setBothIdleTime(int)}
* @param bothIdleTime
*/
public void setBothIdleTime(int bothIdleTime) {
this.bothIdleTime = bothIdleTime;
}
public void setOptionsConfigure(ServerOptionsConfigure optionsConfigure) {
this.optionsConfigure = optionsConfigure;
}
}