package gate; /** * Created by Qzy on 2016/1/28. */ import gate.handler.GateServerHandler; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import protobuf.ParseRegistryMap; import protobuf.code.PacketDecoder; import protobuf.code.PacketEncoder; import java.net.InetSocketAddress; public class GateServer { private static final Logger logger = LoggerFactory.getLogger(GateServer.class); public static void startGateServer(int port) { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workGroup = new NioEventLoopGroup(); ServerBootstrap bootstrap = new ServerBootstrap() .group(bossGroup, workGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel channel) throws Exception { ChannelPipeline pipeline = channel.pipeline(); pipeline.addLast("MessageDecoder", new PacketDecoder()); pipeline.addLast("MessageEncoder", new PacketEncoder()); pipeline.addLast("ClientMessageHandler", new GateServerHandler()); } }); bindConnectionOptions(bootstrap); bootstrap.bind(new InetSocketAddress(port)).addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { if (future.isSuccess()) { //init Registry ParseRegistryMap.initRegistry(); TransferHandlerMap.initRegistry(); logger.info("[GateServer] Started Successed, registry is complete, waiting for client connect..."); } else { logger.error("[GateServer] Started Failed, registry is incomplete"); } } }); } protected static void bindConnectionOptions(ServerBootstrap bootstrap) { bootstrap.option(ChannelOption.SO_BACKLOG, 1024); bootstrap.childOption(ChannelOption.SO_LINGER, 0); bootstrap.childOption(ChannelOption.TCP_NODELAY, true); bootstrap.childOption(ChannelOption.SO_REUSEADDR, true); //调试用 bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); //心跳机制暂时使用TCP选项,之后再自己实现 } }