Java tutorial
/** * This file is part of Ogar. * * Ogar is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Ogar is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Ogar. If not, see <http://www.gnu.org/licenses/>. */ package ru.calypso.ogar.server.net; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.Channel; import io.netty.channel.ChannelException; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpServerCodec; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; import ru.calypso.ogar.server.OgarServer; import ru.calypso.ogar.server.config.Config; import java.io.IOException; import org.apache.log4j.Logger; public class NetworkManager { private static Logger _log = Logger.getLogger(NetworkManager.class); private final OgarServer server; private EventLoopGroup bossGroup; private EventLoopGroup workerGroup; private Channel channel; public NetworkManager(OgarServer server) { this.server = server; } public void start() throws IOException, InterruptedException { bossGroup = new NioEventLoopGroup(); workerGroup = new NioEventLoopGroup(); ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) .handler(new LoggingHandler(LogLevel.INFO)).childHandler(new ClientInitializer(server)); channel = b.bind(Config.Server.PORT).sync().channel(); _log.info("Server started on port " + Config.Server.PORT + "."); } public boolean shutdown() { if (channel == null) { return false; } try { channel.close().sync(); return true; } catch (InterruptedException ex) { return false; } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } private static class ClientInitializer extends ChannelInitializer<SocketChannel> { private final OgarServer server; public ClientInitializer(OgarServer server) { this.server = server; } @Override protected void initChannel(SocketChannel ch) throws Exception { try { ch.config().setOption(ChannelOption.IP_TOS, 0x18); } catch (ChannelException ex) { // IP_TOS not supported by platform, ignore } ch.config().setAllocator(PooledByteBufAllocator.DEFAULT); ch.pipeline().addLast(new HttpServerCodec()); ch.pipeline().addLast(new HttpObjectAggregator(65536)); ch.pipeline().addLast(new WebSocketHandler()); ch.pipeline().addLast(new PacketDecoder()); ch.pipeline().addLast(new PacketEncoder()); ch.pipeline().addLast(new ClientHandler(server)); } } }