package untouchedwagons.minecraft.mcrc2.http;
import cpw.mods.fml.common.FMLLog;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
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.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import untouchedwagons.minecraft.mcrc2.http.routing.Router;
public final class WebSocketServer extends Thread {
private final int port;
private EventLoopGroup bossGroup;
private EventLoopGroup workerGroup;
private final Router router;
public WebSocketServer(int port) {
this.port = port;
this.bossGroup = new NioEventLoopGroup(1);
this.workerGroup = new NioEventLoopGroup();
this.router = new Router();
Runtime.getRuntime().addShutdownHook(new WebSocketServerStopper(this));
}
@Override
public void run()
{
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
//.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new HttpServerCodec());
pipeline.addLast(new HttpObjectAggregator(65536));
pipeline.addLast(new WebSocketServerHandler(router));
}
});
Channel ch = b.bind(this.port).sync().channel();
FMLLog.info("Open your web browser and navigate to http://127.0.0.1:%d/", this.port);
ch.closeFuture().sync();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void stopServer()
{
System.out.println("Stopping server");
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
public Router getRouter() {
return router;
}
private final class WebSocketServerStopper extends Thread
{
private final WebSocketServer server;
private WebSocketServerStopper(WebSocketServer server) {
this.server = server;
}
@Override
public void run()
{
this.server.stopServer();
}
}
}