package com.lefu.remote.netty.client; import com.lefu.remote.netty.ChannelHandlerFactory; import com.lefu.remote.netty.AbstractChannelInitializer; import com.lefu.remote.netty.DefaultChannelInitializer; import com.lefu.remote.netty.server.IOServer; import io.netty.bootstrap.Bootstrap; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelOption; /** * 示例:默认的客户端实现 * * <pre> * 应用只需要覆盖 {@link IOConnector#configure()},调整网络配置则覆盖 {@link IOServer#options(ServerBootstrap)},并提供 {@link ChannelHandlerFactory} 的实现类即可。 * </pre> * * @author jiang.li * */ public class IOConnector extends AbstractClientConfigure { private ClientOptionsConfigure 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 IOConnector() { } public IOConnector(ChannelHandlerFactory handlerFactory) { this.handlerFactory = handlerFactory; } @Override public void configure() { if (handlerFactory == null) { throw new NullPointerException("ChannelHandlerFactory must not be null"); } DefaultChannelInitializer clientChannelInitializer = new DefaultChannelInitializer( handlerFactory); clientChannelInitializer.setUseSingleton(useSingleton); clientChannelInitializer.setBothIdleTime(bothIdleTime); clientChannelInitializer.setEnableIdleHandler(enableIdleHandler); clientChannelInitializer.setEnableTimeoutHandler(enableTimeoutHandler); clientChannelInitializer.setReadIdleTime(readIdleTime); clientChannelInitializer.setTimeout(timeout); clientChannelInitializer.setWriteIdleTime(writeIdleTime); setChannelInitializer(clientChannelInitializer); } @Override protected void options(Bootstrap bootstrap) { bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000); 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(ClientOptionsConfigure optionsConfigure) { this.optionsConfigure = optionsConfigure; } public ClientOptionsConfigure getOptionsConfigure() { return optionsConfigure; } public ChannelHandlerFactory getHandlerFactory() { return handlerFactory; } public boolean isUseSingleton() { return useSingleton; } public boolean isEnableTimeoutHandler() { return enableTimeoutHandler; } public boolean isEnableIdleHandler() { return enableIdleHandler; } public int getTimeout() { return timeout; } public int getReadIdleTime() { return readIdleTime; } public int getWriteIdleTime() { return writeIdleTime; } public int getBothIdleTime() { return bothIdleTime; } }