diff --git a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformDatagramChannelAndroid.kt b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformDatagramChannelAndroid.kt index 8669dfcf3..f9b48b17e 100644 --- a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformDatagramChannelAndroid.kt +++ b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformDatagramChannelAndroid.kt @@ -2,43 +2,42 @@ package net.mamoe.mirai.utils.io import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.Closeable -import kotlinx.io.core.IoBuffer -import kotlinx.io.nio.read +import kotlinx.io.nio.readPacketAtMost +import kotlinx.io.nio.writePacket import java.net.InetSocketAddress import java.nio.channels.DatagramChannel import java.nio.channels.ReadableByteChannel +import java.nio.channels.WritableByteChannel -actual class PlatformDatagramChannel actual constructor(serverHost: String, serverPort: Short) : Closeable { - private val serverAddress: InetSocketAddress = InetSocketAddress(serverHost, serverPort.toInt()) - private val channel: DatagramChannel = DatagramChannel.open().connect(serverAddress) +actual typealias ClosedChannelException = java.nio.channels.ClosedChannelException - @Throws(ReadPacketInternalException::class) - actual suspend fun read(buffer: IoBuffer) = withContext(Dispatchers.IO) { +/** + * 多平台适配的 DatagramChannel. + */ +actual class PlatformDatagramChannel actual constructor( + serverHost: String, + serverPort: Short +) : Closeable { + @PublishedApi + internal val channel: DatagramChannel = DatagramChannel.open().connect(InetSocketAddress(serverHost, serverPort.toInt())) + actual val isOpen: Boolean get() = channel.isOpen + override fun close() = channel.close() + + actual suspend inline fun send(packet: ByteReadPacket): Boolean = withContext(Dispatchers.IO) { try { + (channel as WritableByteChannel).writePacket(packet) + } catch (e: Throwable) { + throw SendPacketInternalException(e) + } + } - (channel as ReadableByteChannel).read(buffer) + actual suspend inline fun read(): ByteReadPacket = withContext(Dispatchers.IO) { + try { + (channel as ReadableByteChannel).readPacketAtMost(Long.MAX_VALUE) } catch (e: Throwable) { throw ReadPacketInternalException(e) } } - - @Throws(SendPacketInternalException::class) - actual suspend fun send(buffer: IoBuffer) = withContext(Dispatchers.IO) { - buffer.readDirect { - try { - channel.send(it, serverAddress) - } catch (e: Throwable) { - throw SendPacketInternalException(e) - } - } - } - - override fun close() { - channel.close() - } - - actual val isOpen: Boolean get() = channel.isOpen -} - -actual typealias ClosedChannelException = java.nio.channels.ClosedChannelException \ No newline at end of file +} \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformSocket.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformDatagramChannel.kt similarity index 68% rename from mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformSocket.kt rename to mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformDatagramChannel.kt index 30e4d7745..f58d3d742 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformSocket.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/PlatformDatagramChannel.kt @@ -1,16 +1,24 @@ package net.mamoe.mirai.utils.io +import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.Closeable -import kotlinx.io.core.IoBuffer import kotlinx.io.errors.IOException +import net.mamoe.mirai.utils.MiraiInternalAPI /** * 多平台适配的 DatagramChannel. */ +@MiraiInternalAPI expect class PlatformDatagramChannel(serverHost: String, serverPort: Short) : Closeable { + /** + * @throws SendPacketInternalException + */ + suspend inline fun send(packet: ByteReadPacket): Boolean - suspend fun read(buffer: IoBuffer): Int - suspend fun send(buffer: IoBuffer): Int + /** + * @throws ReadPacketInternalException + */ + suspend inline fun read(): ByteReadPacket val isOpen: Boolean } diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocketJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocketJvm.kt index 8acc58283..405acfe36 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocketJvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocketJvm.kt @@ -2,49 +2,47 @@ package net.mamoe.mirai.utils.io import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.Closeable -import kotlinx.io.core.IoBuffer -import kotlinx.io.nio.read +import kotlinx.io.nio.readPacketAtMost +import kotlinx.io.nio.writePacket import java.net.InetSocketAddress import java.nio.channels.DatagramChannel import java.nio.channels.ReadableByteChannel +import java.nio.channels.WritableByteChannel -actual class PlatformDatagramChannel actual constructor(serverHost: String, serverPort: Short) : Closeable { - private val serverAddress: InetSocketAddress = InetSocketAddress(serverHost, serverPort.toInt()) - private val channel: DatagramChannel = DatagramChannel.open().connect(serverAddress) - @Throws(ReadPacketInternalException::class) - actual suspend fun read(buffer: IoBuffer) = withContext(Dispatchers.IO) { +actual typealias ClosedChannelException = java.nio.channels.ClosedChannelException + +/** + * 多平台适配的 DatagramChannel. + */ +actual class PlatformDatagramChannel actual constructor( + serverHost: String, + serverPort: Short +) : Closeable { + @PublishedApi + internal val channel: DatagramChannel = DatagramChannel.open().connect(InetSocketAddress(serverHost, serverPort.toInt())) + actual val isOpen: Boolean get() = channel.isOpen + override fun close() = channel.close() + + actual suspend inline fun send(packet: ByteReadPacket): Boolean = withContext(Dispatchers.IO) { try { - (channel as ReadableByteChannel).read(buffer) - } catch (e: ClosedChannelException) { - throw e + (channel as WritableByteChannel).writePacket(packet) + } catch (e: Throwable) { + throw SendPacketInternalException(e) + } + } + + actual suspend inline fun read(): ByteReadPacket = withContext(Dispatchers.IO) { + try { + (channel as ReadableByteChannel).readPacketAtMost(Long.MAX_VALUE) } catch (e: Throwable) { throw ReadPacketInternalException(e) } } - - @Throws(SendPacketInternalException::class) - actual suspend fun send(buffer: IoBuffer) = withContext(Dispatchers.IO) { - buffer.readDirect { - try { - channel.send(it, serverAddress) - } catch (e: Throwable) { - throw SendPacketInternalException(e) - } - } - } - - override fun close() { - channel.close() - } - - actual val isOpen: Boolean get() = channel.isOpen } -actual typealias ClosedChannelException = java.nio.channels.ClosedChannelException - - /* actual class PlatformDatagramChannel actual constructor(serverHost: String, serverPort: Short) : Closeable {