Add network socket example for ktor-network and netty

This commit is contained in:
2026-09-08 02:14:42 +08:00
parent ff14d8bf00
commit 716e1f188e
18 files changed
+271 -60

No files matched your search

@@ -97,9 +97,9 @@ public fun createMinecraftClient(
accessToken: String?,
parentJob: Job? = null,
ioDispatcher: CoroutineDispatcher = Dispatchers.IO,
contextBuilder: ProtocolContextBuilder.() -> Unit,
context: ProtocolContextBuilder.() -> Unit,
): MinecraftClient {
val context = ProtocolContextBuilder(accessToken != null).apply(contextBuilder).build()
val context = ProtocolContextBuilder(accessToken != null).apply(context).build()
return MinecraftClient(
host = host,
port = port,
@@ -0,0 +1,50 @@
/*
* Copyright © 2026 RTAkland
* Author: RTAkland
* Date: 2026/9/8
*/
package test
import cn.rtast.libmc.network.RawSocket
import cn.rtast.libmc.network.ReadChannel
import cn.rtast.libmc.network.SocketEngine
import cn.rtast.libmc.network.WriteChannel
import io.ktor.network.selector.*
import io.ktor.network.sockets.*
import io.ktor.utils.io.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
class KtorNetworkEngine : SocketEngine {
override fun create(host: String, port: Int): RawSocket = KtorNetworkSocket(host, port)
}
class KtorNetworkSocket(private val host: String, private val port: Int) : RawSocket {
private val sm = SelectorManager(Dispatchers.IO)
private lateinit var socket: Socket
override suspend fun connect(): Unit = run { socket = aSocket(sm).tcp().connect(host, port) }
override fun openReadChannel(): ReadChannel = KtorReadChannel(socket.openReadChannel())
override fun openWriteChannel(): WriteChannel = KtorWriteChannel(socket.openWriteChannel())
override fun close() {
socket.close()
sm.close()
}
}
class KtorReadChannel(private val readChannel: ByteReadChannel) : ReadChannel {
override suspend fun readByte(): Byte = readChannel.readByte()
override suspend fun readBytes(length: Int): ByteArray = readChannel.readByteArray(length)
override suspend fun readFully(out: ByteArray, start: Int, end: Int): Unit =
readChannel.readFully(out, start, end)
}
class KtorWriteChannel(private val writeChannel: ByteWriteChannel) : WriteChannel {
override suspend fun writeFully(value: ByteArray, startIndex: Int, endIndex: Int) {
writeChannel.writeFully(value, startIndex, endIndex)
}
override suspend fun flush(): Unit = writeChannel.flush()
}
@@ -7,9 +7,10 @@
package test
import cn.rtast.libmc.network.withCustom
import cn.rtast.libmc.packet.ClientboundUnknownPacket
import cn.rtast.libmc.protocol.client.createMinecraftClient
import cn.rtast.libmc.protocol.crypto.DefaultProtocolContext
import cn.rtast.libmc.protocol.context.DefaultProtocolContext
import cn.rtast.libmc.protocol.packet.play.clientbound.ClientboundPlayerChatMessagePacket
import cn.rtast.libmc.protocol.packet.play.serverbound.ServerboundChatMessagePacket
import cn.rtast.libmc.protocol.util.generateOfflineUuid
@@ -63,7 +64,7 @@ class TestClientTestInJvm {
Uuid.parse("bb033844-e68e-4909-a636-1a5d1821ddc4"),
// null,
accessToken,
contextBuilder = DefaultProtocolContext
context = DefaultProtocolContext
)
// cli.onPacket<ClientboundSystemChatMessagePacket> { println(it) }
// cli.onPacket<ClientboundLoginSuccessPacket> { println(it) }
@@ -81,8 +82,11 @@ class TestClientTestInJvm {
"11",
generateOfflineUuid("11"),
null,
contextBuilder = DefaultProtocolContext
context = DefaultProtocolContext.withCustom {
socketEngine = KtorNetworkEngine()
}
)
// cli.on { packet, direction ->
// if (packet !is ClientboundWaypointPacket)
// println("$direction -> $packet")