MCSM: подготовка к WebSocket
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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<?, Webinterface> 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) {
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* DmitriyMX <dimon550@gmail.com>
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* DmitriyMX <dimon550@gmail.com>
|
||||
* 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<SocketChannel>() {
|
||||
@Override
|
||||
protected void initChannel(SocketChannel socketChannel) throws Exception {
|
||||
socketChannel.pipeline().addLast(
|
||||
new HttpServerCodec(),
|
||||
new IndexPageHandler()
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user