mirror of
https://github.com/tursom/TursomServer.git
synced 2025-03-27 20:40:29 +08:00
update WebSocketClient
This commit is contained in:
parent
f97cc59191
commit
befef46add
@ -494,7 +494,8 @@ fun getCallerClass(thisClassName: List<String>): Class<*>? {
|
|||||||
var callStackDepth = 1
|
var callStackDepth = 1
|
||||||
do {
|
do {
|
||||||
clazz = getCallerClass(callStackDepth++)
|
clazz = getCallerClass(callStackDepth++)
|
||||||
if (clazz?.name !in thisClassName) {
|
val clazzName = clazz?.name
|
||||||
|
if (clazzName != "cn.tursom.core.ToolsKt" && clazzName !in thisClassName) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
} while (clazz != null)
|
} while (clazz != null)
|
||||||
|
@ -26,7 +26,10 @@ open class Slf4jImpl constructor(
|
|||||||
|
|
||||||
@Suppress("MemberVisibilityCanBePrivate", "NOTHING_TO_INLINE")
|
@Suppress("MemberVisibilityCanBePrivate", "NOTHING_TO_INLINE")
|
||||||
companion object {
|
companion object {
|
||||||
private val thisClassName = listOf(this::class.java.name.dropLast(10), this::class.java.name)
|
private val thisClassName = listOf(
|
||||||
|
this::class.java.name.dropLast(10),
|
||||||
|
this::class.java.name,
|
||||||
|
)
|
||||||
private val loggerName: String
|
private val loggerName: String
|
||||||
get() = getCallerClassName(thisClassName)?.substringBefore('$')
|
get() = getCallerClassName(thisClassName)?.substringBefore('$')
|
||||||
?: throw UnsupportedOperationException()
|
?: throw UnsupportedOperationException()
|
||||||
|
@ -8,210 +8,210 @@ import io.netty.handler.codec.http.websocketx.PongWebSocketFrame
|
|||||||
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
|
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
open class AbstractWebSocketHandler : WebSocketHandler {
|
open class AbstractWebSocketHandler<T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>> : WebSocketHandler<T, H> {
|
||||||
private var onOpen: ((client: WebSocketClient) -> Unit)? = null
|
private var onOpen: ((client: T) -> Unit)? = null
|
||||||
|
|
||||||
fun onOpen(onOpen: ((client: WebSocketClient) -> Unit)) {
|
fun onOpen(onOpen: ((client: T) -> Unit)) {
|
||||||
this.onOpen = onOpen
|
this.onOpen = onOpen
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onOpen(client: WebSocketClient) {
|
override fun onOpen(client: T) {
|
||||||
onOpen?.also { it(client) } ?: super.onOpen(client)
|
onOpen?.also { it(client) } ?: super.onOpen(client)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var onClose: ((client: WebSocketClient) -> Unit)? = null
|
private var onClose: ((client: T) -> Unit)? = null
|
||||||
|
|
||||||
fun onClose(onClose: ((client: WebSocketClient) -> Unit)) {
|
fun onClose(onClose: ((client: T) -> Unit)) {
|
||||||
this.onClose = onClose
|
this.onClose = onClose
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onClose(client: WebSocketClient) {
|
override fun onClose(client: T) {
|
||||||
onClose?.also { it(client) } ?: super.onClose(client)
|
onClose?.also { it(client) } ?: super.onClose(client)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var onError: ((client: WebSocketClient, e: Throwable) -> Unit)? = null
|
private var onError: ((client: T, e: Throwable) -> Unit)? = null
|
||||||
|
|
||||||
fun onError(onError: ((client: WebSocketClient, e: Throwable) -> Unit)) {
|
fun onError(onError: ((client: T, e: Throwable) -> Unit)) {
|
||||||
this.onError = onError
|
this.onError = onError
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onError(client: WebSocketClient, e: Throwable) {
|
override fun onError(client: T, e: Throwable) {
|
||||||
onError?.also { it(client, e) } ?: super.onError(client, e)
|
onError?.also { it(client, e) } ?: super.onError(client, e)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readMessage1: ((client: WebSocketClient, msg: String) -> Unit)? = null
|
private var readMessage1: ((client: T, msg: String) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readMessage1")
|
@JvmName("readMessage1")
|
||||||
fun readMessage(readMessage: (client: WebSocketClient, msg: String) -> Unit) {
|
fun readMessage(readMessage: (client: T, msg: String) -> Unit) {
|
||||||
readMessage1 = readMessage
|
readMessage1 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readMessage(client: WebSocketClient, msg: String) {
|
override fun readMessage(client: T, msg: String) {
|
||||||
readMessage1?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
readMessage1?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readMessage2: ((client: WebSocketClient, msg: TextWebSocketFrame) -> Unit)? = null
|
private var readMessage2: ((client: T, msg: TextWebSocketFrame) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readMessage2")
|
@JvmName("readMessage2")
|
||||||
fun readMessage(readMessage: (client: WebSocketClient, msg: TextWebSocketFrame) -> Unit) {
|
fun readMessage(readMessage: (client: T, msg: TextWebSocketFrame) -> Unit) {
|
||||||
readMessage2 = readMessage
|
readMessage2 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readMessage(client: WebSocketClient, msg: TextWebSocketFrame) {
|
override fun readMessage(client: T, msg: TextWebSocketFrame) {
|
||||||
readMessage2?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
readMessage2?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readMessage3: ((client: WebSocketClient, msg: ByteArray) -> Unit)? = null
|
private var readMessage3: ((client: T, msg: ByteArray) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readMessage3")
|
@JvmName("readMessage3")
|
||||||
fun readMessage(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) {
|
fun readMessage(readMessage: (client: T, msg: ByteArray) -> Unit) {
|
||||||
readMessage3 = readMessage
|
readMessage3 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readMessage(client: WebSocketClient, msg: ByteArray) {
|
override fun readMessage(client: T, msg: ByteArray) {
|
||||||
readMessage3?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
readMessage3?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readMessage4: ((client: WebSocketClient, msg: ByteBuf) -> Unit)? = null
|
private var readMessage4: ((client: T, msg: ByteBuf) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readMessage4")
|
@JvmName("readMessage4")
|
||||||
fun readMessage(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) {
|
fun readMessage(readMessage: (client: T, msg: ByteBuf) -> Unit) {
|
||||||
readMessage4 = readMessage
|
readMessage4 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readMessage(client: WebSocketClient, msg: ByteBuf) {
|
override fun readMessage(client: T, msg: ByteBuf) {
|
||||||
readMessage4?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
readMessage4?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readMessage5: ((client: WebSocketClient, msg: ByteBuffer) -> Unit)? = null
|
private var readMessage5: ((client: T, msg: ByteBuffer) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readMessage5")
|
@JvmName("readMessage5")
|
||||||
fun readMessage(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) {
|
fun readMessage(readMessage: (client: T, msg: ByteBuffer) -> Unit) {
|
||||||
readMessage5 = readMessage
|
readMessage5 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readMessage(client: WebSocketClient, msg: ByteBuffer) {
|
override fun readMessage(client: T, msg: ByteBuffer) {
|
||||||
readMessage5?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
readMessage5?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readMessage6: ((client: WebSocketClient, msg: BinaryWebSocketFrame) -> Unit)? = null
|
private var readMessage6: ((client: T, msg: BinaryWebSocketFrame) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readMessage6")
|
@JvmName("readMessage6")
|
||||||
fun readMessage(readMessage: (client: WebSocketClient, msg: BinaryWebSocketFrame) -> Unit) {
|
fun readMessage(readMessage: (client: T, msg: BinaryWebSocketFrame) -> Unit) {
|
||||||
readMessage6 = readMessage
|
readMessage6 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readMessage(client: WebSocketClient, msg: BinaryWebSocketFrame) {
|
override fun readMessage(client: T, msg: BinaryWebSocketFrame) {
|
||||||
readMessage6?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
readMessage6?.also { it(client, msg) } ?: super.readMessage(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readPing1: ((client: WebSocketClient, msg: PingWebSocketFrame) -> Unit)? = null
|
private var readPing1: ((client: T, msg: PingWebSocketFrame) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readPing1")
|
@JvmName("readPing1")
|
||||||
fun readPing(readMessage: (client: WebSocketClient, msg: PingWebSocketFrame) -> Unit) {
|
fun readPing(readMessage: (client: T, msg: PingWebSocketFrame) -> Unit) {
|
||||||
readPing1 = readMessage
|
readPing1 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPing(client: WebSocketClient, msg: PingWebSocketFrame) {
|
override fun readPing(client: T, msg: PingWebSocketFrame) {
|
||||||
readPing1?.also { it(client, msg) } ?: super.readPing(client, msg)
|
readPing1?.also { it(client, msg) } ?: super.readPing(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readPing2: ((client: WebSocketClient, msg: ByteBuf) -> Unit)? = null
|
private var readPing2: ((client: T, msg: ByteBuf) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readPing2")
|
@JvmName("readPing2")
|
||||||
fun readPing(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) {
|
fun readPing(readMessage: (client: T, msg: ByteBuf) -> Unit) {
|
||||||
readPing2 = readMessage
|
readPing2 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPing(client: WebSocketClient, msg: ByteBuf) {
|
override fun readPing(client: T, msg: ByteBuf) {
|
||||||
readPing2?.also { it(client, msg) } ?: super.readPing(client, msg)
|
readPing2?.also { it(client, msg) } ?: super.readPing(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readPing3: ((client: WebSocketClient, msg: ByteBuffer) -> Unit)? = null
|
private var readPing3: ((client: T, msg: ByteBuffer) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readPing3")
|
@JvmName("readPing3")
|
||||||
fun readPing(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) {
|
fun readPing(readMessage: (client: T, msg: ByteBuffer) -> Unit) {
|
||||||
readPing3 = readMessage
|
readPing3 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPing(client: WebSocketClient, msg: ByteBuffer) {
|
override fun readPing(client: T, msg: ByteBuffer) {
|
||||||
readPing3?.also { it(client, msg) } ?: super.readPing(client, msg)
|
readPing3?.also { it(client, msg) } ?: super.readPing(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readPing4: ((client: WebSocketClient, msg: ByteArray) -> Unit)? = null
|
private var readPing4: ((client: T, msg: ByteArray) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readPing4")
|
@JvmName("readPing4")
|
||||||
fun readPing(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) {
|
fun readPing(readMessage: (client: T, msg: ByteArray) -> Unit) {
|
||||||
readPing4 = readMessage
|
readPing4 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPing(client: WebSocketClient, msg: ByteArray) {
|
override fun readPing(client: T, msg: ByteArray) {
|
||||||
readPing4?.also { it(client, msg) } ?: super.readPing(client, msg)
|
readPing4?.also { it(client, msg) } ?: super.readPing(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readPing5: ((client: WebSocketClient, msg: String) -> Unit)? = null
|
private var readPing5: ((client: T, msg: String) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readPing5")
|
@JvmName("readPing5")
|
||||||
fun readPing(readMessage: (client: WebSocketClient, msg: String) -> Unit) {
|
fun readPing(readMessage: (client: T, msg: String) -> Unit) {
|
||||||
readPing5 = readMessage
|
readPing5 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPing(client: WebSocketClient, msg: String) {
|
override fun readPing(client: T, msg: String) {
|
||||||
readPing5?.also { it(client, msg) } ?: super.readPing(client, msg)
|
readPing5?.also { it(client, msg) } ?: super.readPing(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readPong1: ((client: WebSocketClient, msg: PongWebSocketFrame) -> Unit)? = null
|
private var readPong1: ((client: T, msg: PongWebSocketFrame) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readPong1")
|
@JvmName("readPong1")
|
||||||
fun readPong(readMessage: (client: WebSocketClient, msg: PongWebSocketFrame) -> Unit) {
|
fun readPong(readMessage: (client: T, msg: PongWebSocketFrame) -> Unit) {
|
||||||
readPong1 = readMessage
|
readPong1 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPong(client: WebSocketClient, msg: PongWebSocketFrame) {
|
override fun readPong(client: T, msg: PongWebSocketFrame) {
|
||||||
readPong1?.also { it(client, msg) } ?: super.readPong(client, msg)
|
readPong1?.also { it(client, msg) } ?: super.readPong(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readPong2: ((client: WebSocketClient, msg: ByteBuf) -> Unit)? = null
|
private var readPong2: ((client: T, msg: ByteBuf) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readPong2")
|
@JvmName("readPong2")
|
||||||
fun readPong(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) {
|
fun readPong(readMessage: (client: T, msg: ByteBuf) -> Unit) {
|
||||||
readPong2 = readMessage
|
readPong2 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPong(client: WebSocketClient, msg: ByteBuf) {
|
override fun readPong(client: T, msg: ByteBuf) {
|
||||||
readPong2?.also { it(client, msg) } ?: super.readPong(client, msg)
|
readPong2?.also { it(client, msg) } ?: super.readPong(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readPong3: ((client: WebSocketClient, msg: ByteBuffer) -> Unit)? = null
|
private var readPong3: ((client: T, msg: ByteBuffer) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readPong3")
|
@JvmName("readPong3")
|
||||||
fun readPong(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) {
|
fun readPong(readMessage: (client: T, msg: ByteBuffer) -> Unit) {
|
||||||
readPong3 = readMessage
|
readPong3 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPong(client: WebSocketClient, msg: ByteBuffer) {
|
override fun readPong(client: T, msg: ByteBuffer) {
|
||||||
readPong3?.also { it(client, msg) } ?: super.readPong(client, msg)
|
readPong3?.also { it(client, msg) } ?: super.readPong(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readPong4: ((client: WebSocketClient, msg: ByteArray) -> Unit)? = null
|
private var readPong4: ((client: T, msg: ByteArray) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readPong4")
|
@JvmName("readPong4")
|
||||||
fun readPong(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) {
|
fun readPong(readMessage: (client: T, msg: ByteArray) -> Unit) {
|
||||||
readPong4 = readMessage
|
readPong4 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPong(client: WebSocketClient, msg: ByteArray) {
|
override fun readPong(client: T, msg: ByteArray) {
|
||||||
readPong4?.also { it(client, msg) } ?: super.readPong(client, msg)
|
readPong4?.also { it(client, msg) } ?: super.readPong(client, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var readPong5: ((client: WebSocketClient, msg: String) -> Unit)? = null
|
private var readPong5: ((client: T, msg: String) -> Unit)? = null
|
||||||
|
|
||||||
@JvmName("readPong5")
|
@JvmName("readPong5")
|
||||||
fun readPong(readMessage: (client: WebSocketClient, msg: String) -> Unit) {
|
fun readPong(readMessage: (client: T, msg: String) -> Unit) {
|
||||||
readPong5 = readMessage
|
readPong5 = readMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPong(client: WebSocketClient, msg: String) {
|
override fun readPong(client: T, msg: String) {
|
||||||
readPong5?.also { it(client, msg) } ?: super.readPong(client, msg)
|
readPong5?.also { it(client, msg) } ?: super.readPong(client, msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,23 +3,23 @@ package cn.tursom.core.ws
|
|||||||
import cn.tursom.core.buffer.ByteBuffer
|
import cn.tursom.core.buffer.ByteBuffer
|
||||||
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
|
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
|
||||||
|
|
||||||
interface AutoCloseWebSocketHandler : WebSocketHandler {
|
interface AutoCloseWebSocketHandler<in T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>> : WebSocketHandler<T, H> {
|
||||||
override fun readMessage(client: WebSocketClient, msg: TextWebSocketFrame) {
|
override fun readMessage(client: T, msg: TextWebSocketFrame) {
|
||||||
super.readMessage(client, msg)
|
super.readMessage(client, msg)
|
||||||
msg.release()
|
msg.release()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readMessage(client: WebSocketClient, msg: ByteBuffer) {
|
override fun readMessage(client: T, msg: ByteBuffer) {
|
||||||
super.readMessage(client, msg)
|
super.readMessage(client, msg)
|
||||||
msg.close()
|
msg.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPing(client: WebSocketClient, msg: ByteBuffer) {
|
override fun readPing(client: T, msg: ByteBuffer) {
|
||||||
super.readPing(client, msg)
|
super.readPing(client, msg)
|
||||||
msg.close()
|
msg.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun readPong(client: WebSocketClient, msg: ByteBuffer) {
|
override fun readPong(client: T, msg: ByteBuffer) {
|
||||||
super.readPong(client, msg)
|
super.readPong(client, msg)
|
||||||
msg.close()
|
msg.close()
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
package cn.tursom.core.ws
|
||||||
|
|
||||||
|
import io.netty.channel.socket.SocketChannel
|
||||||
|
import java.net.URI
|
||||||
|
|
||||||
|
/**
|
||||||
|
* usually use SimpWebSocketHandler
|
||||||
|
* @see SimpWebSocketHandler
|
||||||
|
*/
|
||||||
|
class SimpWebSocketClient<H : WebSocketHandler<SimpWebSocketClient<H>, H>>(
|
||||||
|
url: String,
|
||||||
|
handler: H,
|
||||||
|
autoWrap: Boolean = true,
|
||||||
|
log: Boolean = false,
|
||||||
|
compressed: Boolean = true,
|
||||||
|
maxContextLength: Int = 4096,
|
||||||
|
headers: Map<String, String>? = null,
|
||||||
|
handshakerUri: URI? = null,
|
||||||
|
autoRelease: Boolean = true,
|
||||||
|
initChannel: ((ch: SocketChannel) -> Unit)? = null,
|
||||||
|
) : WebSocketClient<SimpWebSocketClient<H>, H>(
|
||||||
|
url,
|
||||||
|
handler,
|
||||||
|
autoWrap,
|
||||||
|
log,
|
||||||
|
compressed,
|
||||||
|
maxContextLength,
|
||||||
|
headers,
|
||||||
|
handshakerUri,
|
||||||
|
autoRelease,
|
||||||
|
initChannel
|
||||||
|
)
|
@ -0,0 +1,11 @@
|
|||||||
|
package cn.tursom.core.ws
|
||||||
|
|
||||||
|
/**
|
||||||
|
* using like
|
||||||
|
* val handler = object : AbstractWebSocketHandler<SimpWebSocketClient<SimpWebSocketHandler>, SimpWebSocketHandler>(),
|
||||||
|
* SimpWebSocketHandler {
|
||||||
|
* }
|
||||||
|
* SimpWebSocketClient("", handler)
|
||||||
|
* to impl AbstractWebSocketHandler's function
|
||||||
|
*/
|
||||||
|
interface SimpWebSocketHandler : WebSocketHandler<SimpWebSocketClient<SimpWebSocketHandler>, SimpWebSocketHandler>
|
@ -3,6 +3,7 @@ package cn.tursom.core.ws
|
|||||||
import cn.tursom.core.ShutdownHook
|
import cn.tursom.core.ShutdownHook
|
||||||
import cn.tursom.core.buffer.ByteBuffer
|
import cn.tursom.core.buffer.ByteBuffer
|
||||||
import cn.tursom.core.buffer.impl.NettyByteBuffer
|
import cn.tursom.core.buffer.impl.NettyByteBuffer
|
||||||
|
import cn.tursom.core.uncheckedCast
|
||||||
import io.netty.bootstrap.Bootstrap
|
import io.netty.bootstrap.Bootstrap
|
||||||
import io.netty.buffer.ByteBuf
|
import io.netty.buffer.ByteBuf
|
||||||
import io.netty.buffer.Unpooled
|
import io.netty.buffer.Unpooled
|
||||||
@ -22,9 +23,9 @@ import java.net.URI
|
|||||||
|
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
open class WebSocketClient(
|
open class WebSocketClient<in T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>>(
|
||||||
url: String,
|
url: String,
|
||||||
open val handler: WebSocketHandler,
|
open val handler: H,
|
||||||
val autoWrap: Boolean = true,
|
val autoWrap: Boolean = true,
|
||||||
val log: Boolean = false,
|
val log: Boolean = false,
|
||||||
val compressed: Boolean = true,
|
val compressed: Boolean = true,
|
||||||
@ -32,7 +33,7 @@ open class WebSocketClient(
|
|||||||
private val headers: Map<String, String>? = null,
|
private val headers: Map<String, String>? = null,
|
||||||
private val handshakerUri: URI? = null,
|
private val handshakerUri: URI? = null,
|
||||||
val autoRelease: Boolean = true,
|
val autoRelease: Boolean = true,
|
||||||
var initChannel: ((ch: SocketChannel) -> Unit)? = null
|
var initChannel: ((ch: SocketChannel) -> Unit)? = null,
|
||||||
) {
|
) {
|
||||||
private val uri: URI = URI.create(url)
|
private val uri: URI = URI.create(url)
|
||||||
var ch: Channel? = null
|
var ch: Channel? = null
|
||||||
@ -44,12 +45,11 @@ open class WebSocketClient(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun open() {
|
fun open(): ChannelFuture? {
|
||||||
close()
|
close()
|
||||||
val scheme = if (uri.scheme == null) "ws" else uri.scheme
|
val scheme = if (uri.scheme == null) "ws" else uri.scheme
|
||||||
val host = if (uri.host == null) "127.0.0.1" else uri.host
|
val host = if (uri.host == null) "127.0.0.1" else uri.host
|
||||||
val port: Int
|
val port = if (uri.port == -1) {
|
||||||
port = if (uri.port == -1) {
|
|
||||||
when {
|
when {
|
||||||
"ws".equals(scheme, ignoreCase = true) -> 80
|
"ws".equals(scheme, ignoreCase = true) -> 80
|
||||||
"wss".equals(scheme, ignoreCase = true) -> 443
|
"wss".equals(scheme, ignoreCase = true) -> 443
|
||||||
@ -61,7 +61,7 @@ open class WebSocketClient(
|
|||||||
|
|
||||||
if (!"ws".equals(scheme, ignoreCase = true) && !"wss".equals(scheme, ignoreCase = true)) {
|
if (!"ws".equals(scheme, ignoreCase = true) && !"wss".equals(scheme, ignoreCase = true)) {
|
||||||
System.err.println("Only WS(S) is supported.")
|
System.err.println("Only WS(S) is supported.")
|
||||||
return
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
val ssl = "wss".equals(scheme, ignoreCase = true)
|
val ssl = "wss".equals(scheme, ignoreCase = true)
|
||||||
@ -78,9 +78,9 @@ open class WebSocketClient(
|
|||||||
val handshakerAdapter = WebSocketClientHandshakerAdapter(
|
val handshakerAdapter = WebSocketClientHandshakerAdapter(
|
||||||
WebSocketClientHandshakerFactory.newHandshaker(
|
WebSocketClientHandshakerFactory.newHandshaker(
|
||||||
handshakerUri ?: uri, WebSocketVersion.V13, null, true, httpHeaders
|
handshakerUri ?: uri, WebSocketVersion.V13, null, true, httpHeaders
|
||||||
), this, handler
|
), uncheckedCast(), handler
|
||||||
)
|
)
|
||||||
val handler = WebSocketClientChannelHandler(this, handler, autoRelease)
|
val handler = WebSocketClientChannelHandler(uncheckedCast(), handler, autoRelease)
|
||||||
val bootstrap = Bootstrap()
|
val bootstrap = Bootstrap()
|
||||||
bootstrap.group(group)
|
bootstrap.group(group)
|
||||||
.channel(NioSocketChannel::class.java)
|
.channel(NioSocketChannel::class.java)
|
||||||
@ -107,8 +107,7 @@ open class WebSocketClient(
|
|||||||
initChannel?.invoke(ch)
|
initChannel?.invoke(ch)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
bootstrap.connect(uri.host, port)
|
return bootstrap.connect(uri.host, port)
|
||||||
//handler.handshakeFuture().sync()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun close(reasonText: String? = null): ChannelFuture? {
|
fun close(reasonText: String? = null): ChannelFuture? {
|
||||||
@ -199,4 +198,4 @@ open class WebSocketClient(
|
|||||||
companion object {
|
companion object {
|
||||||
val group: EventLoopGroup = NioEventLoopGroup()
|
val group: EventLoopGroup = NioEventLoopGroup()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,9 @@ import io.netty.channel.SimpleChannelInboundHandler
|
|||||||
import io.netty.handler.codec.http.websocketx.*
|
import io.netty.handler.codec.http.websocketx.*
|
||||||
|
|
||||||
|
|
||||||
class WebSocketClientChannelHandler(
|
class WebSocketClientChannelHandler<T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>>(
|
||||||
val client: WebSocketClient,
|
val client: T,
|
||||||
val handler: WebSocketHandler,
|
val handler: WebSocketHandler<T, H>,
|
||||||
private val autoRelease: Boolean = true,
|
private val autoRelease: Boolean = true,
|
||||||
) : SimpleChannelInboundHandler<WebSocketFrame>(autoRelease) {
|
) : SimpleChannelInboundHandler<WebSocketFrame>(autoRelease) {
|
||||||
|
|
||||||
|
@ -7,10 +7,10 @@ import io.netty.handler.codec.http.FullHttpResponse
|
|||||||
import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker
|
import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker
|
||||||
import io.netty.util.CharsetUtil
|
import io.netty.util.CharsetUtil
|
||||||
|
|
||||||
class WebSocketClientHandshakerAdapter(
|
class WebSocketClientHandshakerAdapter<T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>>(
|
||||||
private val handshaker: WebSocketClientHandshaker,
|
private val handshaker: WebSocketClientHandshaker,
|
||||||
private val client: WebSocketClient,
|
private val client: T,
|
||||||
private val handler: WebSocketHandler,
|
private val handler: WebSocketHandler<T, H>,
|
||||||
) : SimpleChannelInboundHandler<FullHttpResponse>() {
|
) : SimpleChannelInboundHandler<FullHttpResponse>() {
|
||||||
private var handshakeFuture: ChannelPromise? = null
|
private var handshakeFuture: ChannelPromise? = null
|
||||||
|
|
||||||
|
@ -9,67 +9,67 @@ import io.netty.handler.codec.http.websocketx.PingWebSocketFrame
|
|||||||
import io.netty.handler.codec.http.websocketx.PongWebSocketFrame
|
import io.netty.handler.codec.http.websocketx.PongWebSocketFrame
|
||||||
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
|
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
|
||||||
|
|
||||||
interface WebSocketHandler {
|
interface WebSocketHandler<in T : WebSocketClient<T, in H>, in H : WebSocketHandler<T, H>> {
|
||||||
fun onOpen(client: WebSocketClient) {}
|
fun onOpen(client: T) {}
|
||||||
fun onClose(client: WebSocketClient) {}
|
fun onClose(client: T) {}
|
||||||
fun onError(client: WebSocketClient, e: Throwable) {
|
fun onError(client: T, e: Throwable) {
|
||||||
throw e
|
throw e
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readMessage(client: WebSocketClient, msg: String) {}
|
fun readMessage(client: T, msg: String) {}
|
||||||
fun readMessage(client: WebSocketClient, msg: TextWebSocketFrame) {
|
fun readMessage(client: T, msg: TextWebSocketFrame) {
|
||||||
readMessage(client, msg.text())
|
readMessage(client, msg.text())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readMessage(client: WebSocketClient, msg: ByteArray) {}
|
fun readMessage(client: T, msg: ByteArray) {}
|
||||||
|
|
||||||
fun readMessage(client: WebSocketClient, msg: ByteBuf) {
|
fun readMessage(client: T, msg: ByteBuf) {
|
||||||
readMessage(client, NettyByteBuffer(msg))
|
readMessage(client, NettyByteBuffer(msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readMessage(client: WebSocketClient, msg: ByteBuffer) {
|
fun readMessage(client: T, msg: ByteBuffer) {
|
||||||
readMessage(client, msg.getBytes())
|
readMessage(client, msg.getBytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readMessage(client: WebSocketClient, msg: BinaryWebSocketFrame) {
|
fun readMessage(client: T, msg: BinaryWebSocketFrame) {
|
||||||
readMessage(client, msg.content())
|
readMessage(client, msg.content())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readPing(client: WebSocketClient, msg: PingWebSocketFrame) {
|
fun readPing(client: T, msg: PingWebSocketFrame) {
|
||||||
readPing(client, msg.content())
|
readPing(client, msg.content())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readPing(client: WebSocketClient, msg: ByteBuf) {
|
fun readPing(client: T, msg: ByteBuf) {
|
||||||
readPing(client, NettyByteBuffer(msg))
|
readPing(client, NettyByteBuffer(msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readPing(client: WebSocketClient, msg: ByteBuffer) {
|
fun readPing(client: T, msg: ByteBuffer) {
|
||||||
readPing(client, msg.getBytes())
|
readPing(client, msg.getBytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readPing(client: WebSocketClient, msg: ByteArray) {
|
fun readPing(client: T, msg: ByteArray) {
|
||||||
readPing(client, msg.toUTF8String())
|
readPing(client, msg.toUTF8String())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readPing(client: WebSocketClient, msg: String) {
|
fun readPing(client: T, msg: String) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readPong(client: WebSocketClient, msg: PongWebSocketFrame) {
|
fun readPong(client: T, msg: PongWebSocketFrame) {
|
||||||
readPong(client, msg.content())
|
readPong(client, msg.content())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readPong(client: WebSocketClient, msg: ByteBuf) {
|
fun readPong(client: T, msg: ByteBuf) {
|
||||||
readPong(client, NettyByteBuffer(msg))
|
readPong(client, NettyByteBuffer(msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readPong(client: WebSocketClient, msg: ByteBuffer) {
|
fun readPong(client: T, msg: ByteBuffer) {
|
||||||
readPong(client, msg.getBytes())
|
readPong(client, msg.getBytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readPong(client: WebSocketClient, msg: ByteArray) {
|
fun readPong(client: T, msg: ByteArray) {
|
||||||
readPong(client, msg.toUTF8String())
|
readPong(client, msg.toUTF8String())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun readPong(client: WebSocketClient, msg: String) {
|
fun readPong(client: T, msg: String) {
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user