diff --git a/mcserver-manager/build.gradle b/mcserver-manager/build.gradle index d3ab670..9fb9529 100644 --- a/mcserver-manager/build.gradle +++ b/mcserver-manager/build.gradle @@ -16,6 +16,7 @@ jar { '!asys.mcsmanager.packets.*', 'io.netty.buffer;version="[4.0,5)"', 'io.netty.handler.codec;version="[4.0,5)"', + 'io.netty.handler.codec.http;version="[4.0,5)"', '*' } @@ -32,4 +33,5 @@ dependencies { compile project(':webinterface') include files(project(':bridge-protocol').sourceSets.main.output.classesDir) compile group: 'io.netty', name: 'netty-codec', version: nettyVersion + compile group: 'io.netty', name: 'netty-codec-http', version: nettyVersion } diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/Activator.java b/mcserver-manager/src/main/java/asys/mcsmanager/Activator.java index 91d7f86..f3bc496 100644 --- a/mcserver-manager/src/main/java/asys/mcsmanager/Activator.java +++ b/mcserver-manager/src/main/java/asys/mcsmanager/Activator.java @@ -5,7 +5,6 @@ package asys.mcsmanager; import asys.api.Config; -import asys.mcsmanager.server.Server; import asys.webinterface.api.Webinterface; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; @@ -20,7 +19,8 @@ public class Activator implements BundleActivator, ServiceListener { private ServiceTracker serviceTracker; private MCSM_WebModule module; private Webinterface webinterface; - private Server serverManager; + private asys.mcsmanager.server.Server serverManager; + private asys.mcsmanager.websocket.Server webconsoleServer; @Override public void start(BundleContext context) throws Exception { @@ -43,13 +43,21 @@ public class Activator implements BundleActivator, ServiceListener { int port = config.getInt("asys.mcsmanager.port", 8779); String passcode = config.getString("asys.mcsmanager.passcode", "testpasscode"); logger.debug("Start server manager: {}:{}", host, port); - serverManager = new Server(); + serverManager = new asys.mcsmanager.server.Server(); serverManager.start(host, port, passcode, manager); + + host = config.getString("asys.mcsmanager.webconsole.host", "127.0.0.1"); + port = config.getInt("asys.mcsmanager.webconsole.port", 8770); + logger.debug("Start webconsole server: {}:{}", host, port); + webconsoleServer = new asys.mcsmanager.websocket.Server(); + webconsoleServer.start(host, port); + serviceConfigTracker.close(); } @Override public void stop(BundleContext context) throws Exception { + webconsoleServer.shutdown(); serverManager.shutdown(); if (webinterface != null) { diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/websocket/IndexPageHandler.java b/mcserver-manager/src/main/java/asys/mcsmanager/websocket/IndexPageHandler.java new file mode 100644 index 0000000..a0cd673 --- /dev/null +++ b/mcserver-manager/src/main/java/asys/mcsmanager/websocket/IndexPageHandler.java @@ -0,0 +1,43 @@ +/* + * DmitriyMX + * 2017-05-08 + */ +package asys.mcsmanager.websocket; + +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.handler.codec.http.*; + +public class IndexPageHandler extends ChannelInboundHandlerAdapter { + private static final byte[] CONTENT = "Hello".getBytes(); + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.flush(); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof HttpRequest) { + HttpRequest req = (HttpRequest)msg; + + if (HttpHeaders.is100ContinueExpected(req)) { + ctx.write(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE)); + } + boolean keepAlive = HttpHeaders.isKeepAlive(req); + FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, + Unpooled.wrappedBuffer(CONTENT)); + response.headers().set(HttpHeaders.Names.CONTENT_TYPE, "text/plain"); + response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, response.content().readableBytes()); + + if (!keepAlive) { + ctx.write(response).addListener(ChannelFutureListener.CLOSE); + } else { + response.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE); + ctx.write(response); + } + } + } +} diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/websocket/Server.java b/mcserver-manager/src/main/java/asys/mcsmanager/websocket/Server.java new file mode 100644 index 0000000..c0fb8b2 --- /dev/null +++ b/mcserver-manager/src/main/java/asys/mcsmanager/websocket/Server.java @@ -0,0 +1,52 @@ +/* + * DmitriyMX + * 2017-05-08 + */ +package asys.mcsmanager.websocket; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelInitializer; +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.HttpServerCodec; + +public class Server { + private EventLoopGroup bossGroup, workerGroup; + + public void start(String host, int port) { + bossGroup = new NioEventLoopGroup(1); + workerGroup = new NioEventLoopGroup(); + + ServerBootstrap serverBootstrap = createServerBootstrap(); + serverBootstrap.bind(host, port); + } + + public void shutdown() { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + + private ServerBootstrap createServerBootstrap() { + ServerBootstrap bootstrap = new ServerBootstrap(); + + bootstrap.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childHandler(createChannelInitializer()); + + return bootstrap; + } + + private ChannelInitializer createChannelInitializer() { + return new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + socketChannel.pipeline().addLast( + new HttpServerCodec(), + new IndexPageHandler() + ); + } + }; + } +}