update WebSocketClient

This commit is contained in:
tursom 2021-07-05 15:38:20 +08:00
parent f97cc59191
commit befef46add
10 changed files with 149 additions and 103 deletions

View File

@ -494,7 +494,8 @@ fun getCallerClass(thisClassName: List<String>): Class<*>? {
var callStackDepth = 1
do {
clazz = getCallerClass(callStackDepth++)
if (clazz?.name !in thisClassName) {
val clazzName = clazz?.name
if (clazzName != "cn.tursom.core.ToolsKt" && clazzName !in thisClassName) {
break
}
} while (clazz != null)

View File

@ -26,7 +26,10 @@ open class Slf4jImpl constructor(
@Suppress("MemberVisibilityCanBePrivate", "NOTHING_TO_INLINE")
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
get() = getCallerClassName(thisClassName)?.substringBefore('$')
?: throw UnsupportedOperationException()

View File

@ -8,210 +8,210 @@ import io.netty.handler.codec.http.websocketx.PongWebSocketFrame
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
@Suppress("unused")
open class AbstractWebSocketHandler : WebSocketHandler {
private var onOpen: ((client: WebSocketClient) -> Unit)? = null
open class AbstractWebSocketHandler<T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>> : WebSocketHandler<T, H> {
private var onOpen: ((client: T) -> Unit)? = null
fun onOpen(onOpen: ((client: WebSocketClient) -> Unit)) {
fun onOpen(onOpen: ((client: T) -> Unit)) {
this.onOpen = onOpen
}
override fun onOpen(client: WebSocketClient) {
override fun onOpen(client: T) {
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
}
override fun onClose(client: WebSocketClient) {
override fun onClose(client: T) {
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
}
override fun onError(client: WebSocketClient, e: Throwable) {
override fun onError(client: T, e: Throwable) {
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")
fun readMessage(readMessage: (client: WebSocketClient, msg: String) -> Unit) {
fun readMessage(readMessage: (client: T, msg: String) -> Unit) {
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)
}
private var readMessage2: ((client: WebSocketClient, msg: TextWebSocketFrame) -> Unit)? = null
private var readMessage2: ((client: T, msg: TextWebSocketFrame) -> Unit)? = null
@JvmName("readMessage2")
fun readMessage(readMessage: (client: WebSocketClient, msg: TextWebSocketFrame) -> Unit) {
fun readMessage(readMessage: (client: T, msg: TextWebSocketFrame) -> Unit) {
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)
}
private var readMessage3: ((client: WebSocketClient, msg: ByteArray) -> Unit)? = null
private var readMessage3: ((client: T, msg: ByteArray) -> Unit)? = null
@JvmName("readMessage3")
fun readMessage(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) {
fun readMessage(readMessage: (client: T, msg: ByteArray) -> Unit) {
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)
}
private var readMessage4: ((client: WebSocketClient, msg: ByteBuf) -> Unit)? = null
private var readMessage4: ((client: T, msg: ByteBuf) -> Unit)? = null
@JvmName("readMessage4")
fun readMessage(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) {
fun readMessage(readMessage: (client: T, msg: ByteBuf) -> Unit) {
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)
}
private var readMessage5: ((client: WebSocketClient, msg: ByteBuffer) -> Unit)? = null
private var readMessage5: ((client: T, msg: ByteBuffer) -> Unit)? = null
@JvmName("readMessage5")
fun readMessage(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) {
fun readMessage(readMessage: (client: T, msg: ByteBuffer) -> Unit) {
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)
}
private var readMessage6: ((client: WebSocketClient, msg: BinaryWebSocketFrame) -> Unit)? = null
private var readMessage6: ((client: T, msg: BinaryWebSocketFrame) -> Unit)? = null
@JvmName("readMessage6")
fun readMessage(readMessage: (client: WebSocketClient, msg: BinaryWebSocketFrame) -> Unit) {
fun readMessage(readMessage: (client: T, msg: BinaryWebSocketFrame) -> Unit) {
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)
}
private var readPing1: ((client: WebSocketClient, msg: PingWebSocketFrame) -> Unit)? = null
private var readPing1: ((client: T, msg: PingWebSocketFrame) -> Unit)? = null
@JvmName("readPing1")
fun readPing(readMessage: (client: WebSocketClient, msg: PingWebSocketFrame) -> Unit) {
fun readPing(readMessage: (client: T, msg: PingWebSocketFrame) -> Unit) {
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)
}
private var readPing2: ((client: WebSocketClient, msg: ByteBuf) -> Unit)? = null
private var readPing2: ((client: T, msg: ByteBuf) -> Unit)? = null
@JvmName("readPing2")
fun readPing(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) {
fun readPing(readMessage: (client: T, msg: ByteBuf) -> Unit) {
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)
}
private var readPing3: ((client: WebSocketClient, msg: ByteBuffer) -> Unit)? = null
private var readPing3: ((client: T, msg: ByteBuffer) -> Unit)? = null
@JvmName("readPing3")
fun readPing(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) {
fun readPing(readMessage: (client: T, msg: ByteBuffer) -> Unit) {
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)
}
private var readPing4: ((client: WebSocketClient, msg: ByteArray) -> Unit)? = null
private var readPing4: ((client: T, msg: ByteArray) -> Unit)? = null
@JvmName("readPing4")
fun readPing(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) {
fun readPing(readMessage: (client: T, msg: ByteArray) -> Unit) {
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)
}
private var readPing5: ((client: WebSocketClient, msg: String) -> Unit)? = null
private var readPing5: ((client: T, msg: String) -> Unit)? = null
@JvmName("readPing5")
fun readPing(readMessage: (client: WebSocketClient, msg: String) -> Unit) {
fun readPing(readMessage: (client: T, msg: String) -> Unit) {
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)
}
private var readPong1: ((client: WebSocketClient, msg: PongWebSocketFrame) -> Unit)? = null
private var readPong1: ((client: T, msg: PongWebSocketFrame) -> Unit)? = null
@JvmName("readPong1")
fun readPong(readMessage: (client: WebSocketClient, msg: PongWebSocketFrame) -> Unit) {
fun readPong(readMessage: (client: T, msg: PongWebSocketFrame) -> Unit) {
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)
}
private var readPong2: ((client: WebSocketClient, msg: ByteBuf) -> Unit)? = null
private var readPong2: ((client: T, msg: ByteBuf) -> Unit)? = null
@JvmName("readPong2")
fun readPong(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) {
fun readPong(readMessage: (client: T, msg: ByteBuf) -> Unit) {
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)
}
private var readPong3: ((client: WebSocketClient, msg: ByteBuffer) -> Unit)? = null
private var readPong3: ((client: T, msg: ByteBuffer) -> Unit)? = null
@JvmName("readPong3")
fun readPong(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) {
fun readPong(readMessage: (client: T, msg: ByteBuffer) -> Unit) {
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)
}
private var readPong4: ((client: WebSocketClient, msg: ByteArray) -> Unit)? = null
private var readPong4: ((client: T, msg: ByteArray) -> Unit)? = null
@JvmName("readPong4")
fun readPong(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) {
fun readPong(readMessage: (client: T, msg: ByteArray) -> Unit) {
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)
}
private var readPong5: ((client: WebSocketClient, msg: String) -> Unit)? = null
private var readPong5: ((client: T, msg: String) -> Unit)? = null
@JvmName("readPong5")
fun readPong(readMessage: (client: WebSocketClient, msg: String) -> Unit) {
fun readPong(readMessage: (client: T, msg: String) -> Unit) {
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)
}
}

View File

@ -3,23 +3,23 @@ package cn.tursom.core.ws
import cn.tursom.core.buffer.ByteBuffer
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
interface AutoCloseWebSocketHandler : WebSocketHandler {
override fun readMessage(client: WebSocketClient, msg: TextWebSocketFrame) {
interface AutoCloseWebSocketHandler<in T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>> : WebSocketHandler<T, H> {
override fun readMessage(client: T, msg: TextWebSocketFrame) {
super.readMessage(client, msg)
msg.release()
}
override fun readMessage(client: WebSocketClient, msg: ByteBuffer) {
override fun readMessage(client: T, msg: ByteBuffer) {
super.readMessage(client, msg)
msg.close()
}
override fun readPing(client: WebSocketClient, msg: ByteBuffer) {
override fun readPing(client: T, msg: ByteBuffer) {
super.readPing(client, msg)
msg.close()
}
override fun readPong(client: WebSocketClient, msg: ByteBuffer) {
override fun readPong(client: T, msg: ByteBuffer) {
super.readPong(client, msg)
msg.close()
}

View File

@ -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
)

View File

@ -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>

View File

@ -3,6 +3,7 @@ package cn.tursom.core.ws
import cn.tursom.core.ShutdownHook
import cn.tursom.core.buffer.ByteBuffer
import cn.tursom.core.buffer.impl.NettyByteBuffer
import cn.tursom.core.uncheckedCast
import io.netty.bootstrap.Bootstrap
import io.netty.buffer.ByteBuf
import io.netty.buffer.Unpooled
@ -22,9 +23,9 @@ import java.net.URI
@Suppress("unused")
open class WebSocketClient(
open class WebSocketClient<in T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>>(
url: String,
open val handler: WebSocketHandler,
open val handler: H,
val autoWrap: Boolean = true,
val log: Boolean = false,
val compressed: Boolean = true,
@ -32,7 +33,7 @@ open class WebSocketClient(
private val headers: Map<String, String>? = null,
private val handshakerUri: URI? = null,
val autoRelease: Boolean = true,
var initChannel: ((ch: SocketChannel) -> Unit)? = null
var initChannel: ((ch: SocketChannel) -> Unit)? = null,
) {
private val uri: URI = URI.create(url)
var ch: Channel? = null
@ -44,12 +45,11 @@ open class WebSocketClient(
}
}
fun open() {
fun open(): ChannelFuture? {
close()
val scheme = if (uri.scheme == null) "ws" else uri.scheme
val host = if (uri.host == null) "127.0.0.1" else uri.host
val port: Int
port = if (uri.port == -1) {
val port = if (uri.port == -1) {
when {
"ws".equals(scheme, ignoreCase = true) -> 80
"wss".equals(scheme, ignoreCase = true) -> 443
@ -61,7 +61,7 @@ open class WebSocketClient(
if (!"ws".equals(scheme, ignoreCase = true) && !"wss".equals(scheme, ignoreCase = true)) {
System.err.println("Only WS(S) is supported.")
return
return null
}
val ssl = "wss".equals(scheme, ignoreCase = true)
@ -78,9 +78,9 @@ open class WebSocketClient(
val handshakerAdapter = WebSocketClientHandshakerAdapter(
WebSocketClientHandshakerFactory.newHandshaker(
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()
bootstrap.group(group)
.channel(NioSocketChannel::class.java)
@ -107,8 +107,7 @@ open class WebSocketClient(
initChannel?.invoke(ch)
}
})
bootstrap.connect(uri.host, port)
//handler.handshakeFuture().sync()
return bootstrap.connect(uri.host, port)
}
fun close(reasonText: String? = null): ChannelFuture? {
@ -199,4 +198,4 @@ open class WebSocketClient(
companion object {
val group: EventLoopGroup = NioEventLoopGroup()
}
}
}

View File

@ -5,9 +5,9 @@ import io.netty.channel.SimpleChannelInboundHandler
import io.netty.handler.codec.http.websocketx.*
class WebSocketClientChannelHandler(
val client: WebSocketClient,
val handler: WebSocketHandler,
class WebSocketClientChannelHandler<T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>>(
val client: T,
val handler: WebSocketHandler<T, H>,
private val autoRelease: Boolean = true,
) : SimpleChannelInboundHandler<WebSocketFrame>(autoRelease) {

View File

@ -7,10 +7,10 @@ import io.netty.handler.codec.http.FullHttpResponse
import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker
import io.netty.util.CharsetUtil
class WebSocketClientHandshakerAdapter(
class WebSocketClientHandshakerAdapter<T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>>(
private val handshaker: WebSocketClientHandshaker,
private val client: WebSocketClient,
private val handler: WebSocketHandler,
private val client: T,
private val handler: WebSocketHandler<T, H>,
) : SimpleChannelInboundHandler<FullHttpResponse>() {
private var handshakeFuture: ChannelPromise? = null

View File

@ -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.TextWebSocketFrame
interface WebSocketHandler {
fun onOpen(client: WebSocketClient) {}
fun onClose(client: WebSocketClient) {}
fun onError(client: WebSocketClient, e: Throwable) {
interface WebSocketHandler<in T : WebSocketClient<T, in H>, in H : WebSocketHandler<T, H>> {
fun onOpen(client: T) {}
fun onClose(client: T) {}
fun onError(client: T, e: Throwable) {
throw e
}
fun readMessage(client: WebSocketClient, msg: String) {}
fun readMessage(client: WebSocketClient, msg: TextWebSocketFrame) {
fun readMessage(client: T, msg: String) {}
fun readMessage(client: T, msg: TextWebSocketFrame) {
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))
}
fun readMessage(client: WebSocketClient, msg: ByteBuffer) {
fun readMessage(client: T, msg: ByteBuffer) {
readMessage(client, msg.getBytes())
}
fun readMessage(client: WebSocketClient, msg: BinaryWebSocketFrame) {
fun readMessage(client: T, msg: BinaryWebSocketFrame) {
readMessage(client, msg.content())
}
fun readPing(client: WebSocketClient, msg: PingWebSocketFrame) {
fun readPing(client: T, msg: PingWebSocketFrame) {
readPing(client, msg.content())
}
fun readPing(client: WebSocketClient, msg: ByteBuf) {
fun readPing(client: T, msg: ByteBuf) {
readPing(client, NettyByteBuffer(msg))
}
fun readPing(client: WebSocketClient, msg: ByteBuffer) {
fun readPing(client: T, msg: ByteBuffer) {
readPing(client, msg.getBytes())
}
fun readPing(client: WebSocketClient, msg: ByteArray) {
fun readPing(client: T, msg: ByteArray) {
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())
}
fun readPong(client: WebSocketClient, msg: ByteBuf) {
fun readPong(client: T, msg: ByteBuf) {
readPong(client, NettyByteBuffer(msg))
}
fun readPong(client: WebSocketClient, msg: ByteBuffer) {
fun readPong(client: T, msg: ByteBuffer) {
readPong(client, msg.getBytes())
}
fun readPong(client: WebSocketClient, msg: ByteArray) {
fun readPong(client: T, msg: ByteArray) {
readPong(client, msg.toUTF8String())
}
fun readPong(client: WebSocketClient, msg: String) {
fun readPong(client: T, msg: String) {
}
}