package org.langke.common.server; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.SocketException; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelFactory; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.ChannelUpstreamHandler; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.group.ChannelGroup; import org.jboss.netty.channel.group.ChannelGroupFuture; import org.jboss.netty.channel.group.DefaultChannelGroup; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; import org.jboss.netty.handler.codec.serialization.ObjectDecoder; import org.jboss.netty.handler.codec.serialization.ObjectEncoder; import org.langke.util.logging.ESLogger; import org.langke.util.logging.Loggers; /* * @copyright (c) langke 2011 * @author langke 2011-5-1 */ public abstract class BaseNioServer implements Server { private final ChannelGroup allChannels = new DefaultChannelGroup("nio-server"); protected ESLogger log; protected ServerBootstrap bootstrap; protected ChannelFactory channelFactory = null; private static final int defaultPort = 10001; public BaseNioServer() { } @Override public void init() { log = Loggers.getLogger(this.serverName()); } @Override public void start() { this.channelFactory = this.createChannelFactory(); bootstrap = new ServerBootstrap(channelFactory); bootstrap.setPipelineFactory(getChannelPipelineFactory()); SocketAddress sa = this.getSocketAddress(); Channel serverChannel = bootstrap.bind(sa); allChannels.add(serverChannel); log.info("server started at/" + sa); } @Override public void stop() { ChannelGroupFuture closeFuture = allChannels.close(); closeFuture.awaitUninterruptibly(); if (channelFactory != null) channelFactory.releaseExternalResources(); } protected int defaultPort(){ return defaultPort; } protected ServerAddress getServerAddress() { String myip = "0.0.0.0"; int myport = defaultPort(); try { myip = NetworkUtils.getFirstNonLoopbackAddress(NetworkUtils.StackType.IPv4).getHostAddress(); } catch (SocketException e) { e.printStackTrace(); } return new ServerAddress(myip, myport); } protected final SocketAddress getSocketAddress() { ServerAddress sa = this.getServerAddress(); if(sa.getHost() == null){ return new InetSocketAddress(sa.getPort()); } return new InetSocketAddress(sa.getHost(), sa.getPort()); } protected ChannelFactory createChannelFactory() { return new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()); } protected ChannelPipelineFactory getChannelPipelineFactory() { return new ChannelPipelineFactory() { public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline(new ObjectEncoder(),new ObjectDecoder(), finalChannelUpstreamHandler()); } }; } protected abstract ChannelUpstreamHandler finalChannelUpstreamHandler(); }