From 53f5801d643802c0418a11e4329f46497c856fdc Mon Sep 17 00:00:00 2001 From: tursom Date: Fri, 6 Dec 2019 13:05:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=B9=20Web=20Socket=20?= =?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/tursom/web/netty/NettyHttpServer.kt | 29 +++++++++++++++---- .../web/netty/ws/NettyTextWebSocketFrame.kt | 12 ++++++++ .../web/netty/ws/NettyWebSocketHandler.kt | 15 ++++++++++ .../tursom/web/netty/ws/NettyWsHttpContent.kt | 9 ++++++ .../cn/tursom/web/ws/TextWebSocketFrame.kt | 5 ++++ .../cn/tursom/web/ws/WebSocketContent.kt | 6 ++++ .../kotlin/cn/tursom/web/ws/WebSocketFrame.kt | 7 +++++ .../cn/tursom/web/ws/WebSocketHandler.kt | 24 +++++++++++++++ 8 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyTextWebSocketFrame.kt create mode 100644 web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWebSocketHandler.kt create mode 100644 web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWsHttpContent.kt create mode 100644 web/src/main/kotlin/cn/tursom/web/ws/TextWebSocketFrame.kt create mode 100644 web/src/main/kotlin/cn/tursom/web/ws/WebSocketContent.kt create mode 100644 web/src/main/kotlin/cn/tursom/web/ws/WebSocketFrame.kt create mode 100644 web/src/main/kotlin/cn/tursom/web/ws/WebSocketHandler.kt diff --git a/web/netty-web/src/main/kotlin/cn/tursom/web/netty/NettyHttpServer.kt b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/NettyHttpServer.kt index 9a3b556..4ddd366 100644 --- a/web/netty-web/src/main/kotlin/cn/tursom/web/netty/NettyHttpServer.kt +++ b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/NettyHttpServer.kt @@ -10,15 +10,20 @@ 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.HttpRequestDecoder -import io.netty.handler.codec.http.HttpResponseEncoder +import io.netty.handler.codec.http.HttpServerCodec +import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler import io.netty.handler.stream.ChunkedWriteHandler +import io.netty.handler.timeout.ReadTimeoutHandler +import io.netty.handler.timeout.WriteTimeoutHandler class NettyHttpServer( override val port: Int, handler: HttpHandler, bodySize: Int = 512 * 1024, - autoRun: Boolean = false + autoRun: Boolean = false, + webSocketPath: String? = null, + readTimeout: Int? = null, + writeTimeout: Int? = null ) : HttpServer { constructor( port: Int, @@ -41,10 +46,24 @@ class NettyHttpServer( .childHandler(object : ChannelInitializer() { override fun initChannel(ch: SocketChannel) { ch.pipeline() - .addLast("decoder", HttpRequestDecoder()) - .addLast("encoder", HttpResponseEncoder()) + .apply { + if (readTimeout != null) { + addLast(ReadTimeoutHandler(readTimeout)) + } + } + .apply { + if (writeTimeout != null) { + addLast(WriteTimeoutHandler(writeTimeout)) + } + } + .addLast("codec", HttpServerCodec()) .addLast("aggregator", HttpObjectAggregator(bodySize)) .addLast("http-chunked", ChunkedWriteHandler()) + .apply { + if (webSocketPath != null) { + addLast("ws", WebSocketServerProtocolHandler(webSocketPath)) + } + } .addLast("handle", httpHandler) } }) diff --git a/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyTextWebSocketFrame.kt b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyTextWebSocketFrame.kt new file mode 100644 index 0000000..fe3935c --- /dev/null +++ b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyTextWebSocketFrame.kt @@ -0,0 +1,12 @@ +package cn.tursom.web.netty.ws + +import cn.tursom.core.buffer.ByteBuffer +import cn.tursom.web.netty.NettyByteBuffer +import cn.tursom.web.ws.TextWebSocketFrame + +class NettyTextWebSocketFrame( + @Suppress("MemberVisibilityCanBePrivate") val frame: io.netty.handler.codec.http.websocketx.TextWebSocketFrame +) : TextWebSocketFrame { + override val text: String by lazy { data.toString(data.readable) } + override val data: ByteBuffer = NettyByteBuffer(frame.content()) +} \ No newline at end of file diff --git a/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWebSocketHandler.kt b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWebSocketHandler.kt new file mode 100644 index 0000000..ba0a558 --- /dev/null +++ b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWebSocketHandler.kt @@ -0,0 +1,15 @@ +package cn.tursom.web.netty.ws + +import cn.tursom.web.netty.NettyExceptionContent +import cn.tursom.web.ws.WebSocketHandler +import io.netty.channel.ChannelHandlerContext +import io.netty.channel.SimpleChannelInboundHandler +import io.netty.handler.codec.http.websocketx.WebSocketFrame + +class NettyWebSocketHandler( + val handler: WebSocketHandler +) : SimpleChannelInboundHandler() { + override fun channelRead0(ctx: ChannelHandlerContext?, msg: WebSocketFrame?) { + + } +} \ No newline at end of file diff --git a/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWsHttpContent.kt b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWsHttpContent.kt new file mode 100644 index 0000000..1f8cf7d --- /dev/null +++ b/web/netty-web/src/main/kotlin/cn/tursom/web/netty/ws/NettyWsHttpContent.kt @@ -0,0 +1,9 @@ +package cn.tursom.web.netty.ws + +import io.netty.channel.ChannelHandlerContext +import io.netty.handler.codec.http.FullHttpRequest + +class NettyWsHttpContent( + val ctx: ChannelHandlerContext, + val msg: FullHttpRequest +) \ No newline at end of file diff --git a/web/src/main/kotlin/cn/tursom/web/ws/TextWebSocketFrame.kt b/web/src/main/kotlin/cn/tursom/web/ws/TextWebSocketFrame.kt new file mode 100644 index 0000000..fdfa725 --- /dev/null +++ b/web/src/main/kotlin/cn/tursom/web/ws/TextWebSocketFrame.kt @@ -0,0 +1,5 @@ +package cn.tursom.web.ws + +interface TextWebSocketFrame : WebSocketFrame { + val text: String +} \ No newline at end of file diff --git a/web/src/main/kotlin/cn/tursom/web/ws/WebSocketContent.kt b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketContent.kt new file mode 100644 index 0000000..00398f5 --- /dev/null +++ b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketContent.kt @@ -0,0 +1,6 @@ +package cn.tursom.web.ws + +interface WebSocketContent { + val frame: WebSocketFrame + fun write(frame: WebSocketFrame) +} \ No newline at end of file diff --git a/web/src/main/kotlin/cn/tursom/web/ws/WebSocketFrame.kt b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketFrame.kt new file mode 100644 index 0000000..0986c07 --- /dev/null +++ b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketFrame.kt @@ -0,0 +1,7 @@ +package cn.tursom.web.ws + +import cn.tursom.core.buffer.ByteBuffer + +interface WebSocketFrame { + val data: ByteBuffer +} \ No newline at end of file diff --git a/web/src/main/kotlin/cn/tursom/web/ws/WebSocketHandler.kt b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketHandler.kt new file mode 100644 index 0000000..5bfb546 --- /dev/null +++ b/web/src/main/kotlin/cn/tursom/web/ws/WebSocketHandler.kt @@ -0,0 +1,24 @@ +package cn.tursom.web.ws + +import cn.tursom.web.ExceptionContent +import cn.tursom.web.HttpHandler + +interface WebSocketHandler : HttpHandler { + override fun handle(content: WsHttpContent) { + val frame = content.frame + when (frame) { + is TextWebSocketFrame -> { + handle(content, frame) + } + else -> { + } + } + handle(content, frame) + } + + fun handle(content: WsHttpContent, frame: TextWebSocketFrame) { + } + + fun handle(content: WsHttpContent, frame: WebSocketFrame) { + } +} \ No newline at end of file