|
@@ -0,0 +1,48 @@
|
|
|
+package eu.tankernn.game.server;
|
|
|
+
|
|
|
+import io.netty.bootstrap.ServerBootstrap;
|
|
|
+import io.netty.channel.ChannelFuture;
|
|
|
+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;
|
|
|
+
|
|
|
+public class GameServer {
|
|
|
+ private int port;
|
|
|
+
|
|
|
+ public GameServer(int port) {
|
|
|
+ this.port = port;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void run() throws Exception {
|
|
|
+ EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1)
|
|
|
+ EventLoopGroup workerGroup = new NioEventLoopGroup();
|
|
|
+ try {
|
|
|
+ ServerBootstrap b = new ServerBootstrap(); // (2)
|
|
|
+ b.group(bossGroup, workerGroup)
|
|
|
+ .channel(NioServerSocketChannel.class) // (3)
|
|
|
+ .childHandler(new ChannelInitializer<SocketChannel>() { // (4)
|
|
|
+ @Override
|
|
|
+ public void initChannel(SocketChannel ch) throws Exception {
|
|
|
+ ch.pipeline().addLast(new GameServerHandler());
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .option(ChannelOption.SO_BACKLOG, 128) // (5)
|
|
|
+ .childOption(ChannelOption.SO_KEEPALIVE, true); // (6)
|
|
|
+
|
|
|
+ // Bind and start to accept incoming connections.
|
|
|
+ ChannelFuture f = b.bind(port).sync(); // (7)
|
|
|
+
|
|
|
+ // Wait until the server socket is closed.
|
|
|
+ // In this example, this does not happen, but you can do that to gracefully
|
|
|
+ // shut down your server.
|
|
|
+ f.channel().closeFuture().sync();
|
|
|
+ } finally {
|
|
|
+ workerGroup.shutdownGracefully();
|
|
|
+ bossGroup.shutdownGracefully();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|