com.nus.mazegame.server.GameServer.java Source code

Java tutorial

Introduction

Here is the source code for com.nus.mazegame.server.GameServer.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.nus.mazegame.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.ChannelPipeline;
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.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender;
import io.netty.handler.codec.bytes.ByteArrayDecoder;
import io.netty.handler.codec.bytes.ByteArrayEncoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import static java.lang.System.exit;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author gejun
 */
/**
 * Echoes back any received data from a client.
 */
public final class GameServer {

    static final int PORT = Integer.parseInt(System.getProperty("port", "8007"));

    public static void main(String[] args) {
        if (args.length < 3) {
            System.out.println("Please provide x, y and treasure arguements...");
            exit(1);
        }
        int x = Integer.parseInt(args[0]);
        int y = Integer.parseInt(args[1]);
        int treasure = Integer.parseInt(args[2]);
        try {
            init(PORT, x, y, treasure, false);
        } catch (Exception ex) {
            Logger.getLogger(GameServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void init(int port, int x, int y, int treasure, boolean isSlave) throws Exception {
        GameService.gameService = new GameService(x, y, treasure, isSlave);

        // Configure the server.
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 100).handler(new LoggingHandler(LogLevel.INFO))
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline p = ch.pipeline();
                            // Decoders
                            p.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4));
                            p.addLast("bytesDecoder", new ByteArrayDecoder());

                            // Encoder
                            p.addLast("frameEncoder", new LengthFieldPrepender(4));
                            p.addLast("bytesEncoder", new ByteArrayEncoder());
                            // p.addLast(new LoggingHandler(LogLevel.INFO));
                            p.addLast(new GameServerHandler());
                        }
                    });

            // Start the server.
            ChannelFuture f = b.bind(port).sync();
            Logger.getLogger(GameServerHandler.class.getName()).log(Level.INFO, "Server started...");
            // Wait until the server socket is closed.
            f.channel().closeFuture().sync();
        } finally {
            // Shut down all event loops to terminate all threads.
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}