diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/websocket/FrameHandler.java b/mcserver-manager/src/main/java/asys/mcsmanager/websocket/FrameHandler.java new file mode 100644 index 0000000..1d59d20 --- /dev/null +++ b/mcserver-manager/src/main/java/asys/mcsmanager/websocket/FrameHandler.java @@ -0,0 +1,49 @@ +/* + * DmitriyMX + * 2017-05-09 + */ +package asys.mcsmanager.websocket; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; +import io.netty.handler.codec.http.websocketx.WebSocketFrame; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public class FrameHandler extends SimpleChannelInboundHandler { + private final Logger logger = LoggerFactory.getLogger(FrameHandler.class); + private ScheduledFuture sesFuture; + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + ctx.channel().writeAndFlush(new TextWebSocketFrame("")); + + ScheduledExecutorService ses = Executors.newScheduledThreadPool(1); + sesFuture = ses.scheduleAtFixedRate(() -> ctx.channel().writeAndFlush(new TextWebSocketFrame("")), + 1L, 1L, TimeUnit.SECONDS); + + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + sesFuture.cancel(false); + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception { + if (frame instanceof TextWebSocketFrame) { + String requestText = ((TextWebSocketFrame)frame).text(); + logger.debug("{} received {}", ctx.channel(), requestText); + ctx.channel().writeAndFlush(new TextWebSocketFrame(""+requestText)); + } else { + logger.warn("unsupport frame type: {}", frame.getClass().getName()); + } + } +} diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/websocket/IndexPageHandler.java b/mcserver-manager/src/main/java/asys/mcsmanager/websocket/IndexPageHandler.java deleted file mode 100644 index a0cd673..0000000 --- a/mcserver-manager/src/main/java/asys/mcsmanager/websocket/IndexPageHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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 index c0fb8b2..b73e5d1 100644 --- a/mcserver-manager/src/main/java/asys/mcsmanager/websocket/Server.java +++ b/mcserver-manager/src/main/java/asys/mcsmanager/websocket/Server.java @@ -10,7 +10,9 @@ 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.codec.http.websocketx.WebSocketServerProtocolHandler; public class Server { private EventLoopGroup bossGroup, workerGroup; @@ -44,7 +46,9 @@ public class Server { protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast( new HttpServerCodec(), - new IndexPageHandler() + new HttpObjectAggregator(65536), + new WebSocketServerProtocolHandler("/", null, true), + new FrameHandler() ); } };