MCSM: подготовка к WebSocket
This commit is contained in:
@@ -16,6 +16,7 @@ jar {
|
|||||||
'!asys.mcsmanager.packets.*',
|
'!asys.mcsmanager.packets.*',
|
||||||
'io.netty.buffer;version="[4.0,5)"',
|
'io.netty.buffer;version="[4.0,5)"',
|
||||||
'io.netty.handler.codec;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')
|
compile project(':webinterface')
|
||||||
include files(project(':bridge-protocol').sourceSets.main.output.classesDir)
|
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', version: nettyVersion
|
||||||
|
compile group: 'io.netty', name: 'netty-codec-http', version: nettyVersion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
package asys.mcsmanager;
|
package asys.mcsmanager;
|
||||||
|
|
||||||
import asys.api.Config;
|
import asys.api.Config;
|
||||||
import asys.mcsmanager.server.Server;
|
|
||||||
import asys.webinterface.api.Webinterface;
|
import asys.webinterface.api.Webinterface;
|
||||||
import org.osgi.framework.BundleActivator;
|
import org.osgi.framework.BundleActivator;
|
||||||
import org.osgi.framework.BundleContext;
|
import org.osgi.framework.BundleContext;
|
||||||
@@ -20,7 +19,8 @@ public class Activator implements BundleActivator, ServiceListener {
|
|||||||
private ServiceTracker<?, Webinterface> serviceTracker;
|
private ServiceTracker<?, Webinterface> serviceTracker;
|
||||||
private MCSM_WebModule module;
|
private MCSM_WebModule module;
|
||||||
private Webinterface webinterface;
|
private Webinterface webinterface;
|
||||||
private Server serverManager;
|
private asys.mcsmanager.server.Server serverManager;
|
||||||
|
private asys.mcsmanager.websocket.Server webconsoleServer;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(BundleContext context) throws Exception {
|
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);
|
int port = config.getInt("asys.mcsmanager.port", 8779);
|
||||||
String passcode = config.getString("asys.mcsmanager.passcode", "testpasscode");
|
String passcode = config.getString("asys.mcsmanager.passcode", "testpasscode");
|
||||||
logger.debug("Start server manager: {}:{}", host, port);
|
logger.debug("Start server manager: {}:{}", host, port);
|
||||||
serverManager = new Server();
|
serverManager = new asys.mcsmanager.server.Server();
|
||||||
serverManager.start(host, port, passcode, manager);
|
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();
|
serviceConfigTracker.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void stop(BundleContext context) throws Exception {
|
public void stop(BundleContext context) throws Exception {
|
||||||
|
webconsoleServer.shutdown();
|
||||||
serverManager.shutdown();
|
serverManager.shutdown();
|
||||||
|
|
||||||
if (webinterface != null) {
|
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