mirror of
https://github.com/tursom/TursomServer.git
synced 2025-03-13 19:30:10 +08:00
添加对 Web Socket 的支持
This commit is contained in:
parent
1d66a0ff92
commit
53f5801d64
@ -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<NettyHttpContent, NettyExceptionContent>,
|
||||
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<SocketChannel>() {
|
||||
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)
|
||||
}
|
||||
})
|
||||
|
@ -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())
|
||||
}
|
@ -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<NettyExceptionContent>
|
||||
) : SimpleChannelInboundHandler<WebSocketFrame>() {
|
||||
override fun channelRead0(ctx: ChannelHandlerContext?, msg: WebSocketFrame?) {
|
||||
|
||||
}
|
||||
}
|
@ -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
|
||||
)
|
@ -0,0 +1,5 @@
|
||||
package cn.tursom.web.ws
|
||||
|
||||
interface TextWebSocketFrame : WebSocketFrame {
|
||||
val text: String
|
||||
}
|
6
web/src/main/kotlin/cn/tursom/web/ws/WebSocketContent.kt
Normal file
6
web/src/main/kotlin/cn/tursom/web/ws/WebSocketContent.kt
Normal file
@ -0,0 +1,6 @@
|
||||
package cn.tursom.web.ws
|
||||
|
||||
interface WebSocketContent {
|
||||
val frame: WebSocketFrame
|
||||
fun write(frame: WebSocketFrame)
|
||||
}
|
7
web/src/main/kotlin/cn/tursom/web/ws/WebSocketFrame.kt
Normal file
7
web/src/main/kotlin/cn/tursom/web/ws/WebSocketFrame.kt
Normal file
@ -0,0 +1,7 @@
|
||||
package cn.tursom.web.ws
|
||||
|
||||
import cn.tursom.core.buffer.ByteBuffer
|
||||
|
||||
interface WebSocketFrame {
|
||||
val data: ByteBuffer
|
||||
}
|
24
web/src/main/kotlin/cn/tursom/web/ws/WebSocketHandler.kt
Normal file
24
web/src/main/kotlin/cn/tursom/web/ws/WebSocketHandler.kt
Normal file
@ -0,0 +1,24 @@
|
||||
package cn.tursom.web.ws
|
||||
|
||||
import cn.tursom.web.ExceptionContent
|
||||
import cn.tursom.web.HttpHandler
|
||||
|
||||
interface WebSocketHandler<T : ExceptionContent> : HttpHandler<WsHttpContent, T> {
|
||||
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) {
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user