From 5ae4296bd5f2f6e41acc888fe5c7a455799026fa Mon Sep 17 00:00:00 2001 From: Him188 Date: Wed, 29 Jan 2020 20:12:47 +0800 Subject: [PATCH] Fix PlatformSocket on Android --- .../mamoe/mirai/utils/io/PlatformSocket.kt | 30 ++++++++++++++----- .../mamoe/mirai/utils/io/PlatformSocket.kt | 4 ++- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt index 33a951938..b4fdd1340 100644 --- a/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt +++ b/mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt @@ -1,10 +1,14 @@ package net.mamoe.mirai.utils.io +import io.ktor.network.selector.ActorSelectorManager import io.ktor.network.sockets.Socket import io.ktor.network.sockets.aSocket import io.ktor.network.sockets.openReadChannel import io.ktor.network.sockets.openWriteChannel import io.ktor.util.KtorExperimentalAPI +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.io.ByteReadChannel +import kotlinx.coroutines.io.ByteWriteChannel import kotlinx.coroutines.io.readAvailable import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.Closeable @@ -17,24 +21,28 @@ import net.mamoe.mirai.utils.MiraiInternalAPI @MiraiInternalAPI actual class PlatformSocket : Closeable { @UseExperimental(KtorExperimentalAPI::class) - lateinit var channel: Socket + lateinit var socket: Socket @UseExperimental(KtorExperimentalAPI::class) actual val isOpen: Boolean - get() = channel.socketContext.isActive + get() = socket.socketContext.isActive - override fun close() = channel.dispose() + override fun close() = socket.dispose() @PublishedApi - internal val writeChannel = channel.openWriteChannel(true) + internal lateinit var writeChannel: ByteWriteChannel @PublishedApi - internal val readChannel = channel.openReadChannel() + internal lateinit var readChannel: ByteReadChannel /** * @throws SendPacketInternalException */ actual suspend inline fun send(packet: ByteReadPacket) { - writeChannel.writePacket(packet) + try { + writeChannel.writePacket(packet) + } catch (e: Exception) { + throw SendPacketInternalException(e) + } } /** @@ -43,13 +51,19 @@ actual class PlatformSocket : Closeable { actual suspend inline fun read(): ByteReadPacket { // do not use readChannel.readRemaining() !!! this function never returns ByteArrayPool.useInstance { buffer -> - val count = readChannel.readAvailable(buffer) + val count = try { + readChannel.readAvailable(buffer) + } catch (e: Exception) { + throw ReadPacketInternalException(e) + } return buffer.toReadPacket(0, count) } } @UseExperimental(KtorExperimentalAPI::class) actual suspend fun connect(serverHost: String, serverPort: Int) { - channel = aSocket(io.ktor.network.selector.ActorSelectorManager(kotlinx.coroutines.Dispatchers.IO)).tcp().connect(serverHost, serverPort) + socket = aSocket(ActorSelectorManager(Dispatchers.IO)).tcp().connect(serverHost, serverPort) + writeChannel = socket.openWriteChannel(true) + readChannel = socket.openReadChannel() } } \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt index bfa804929..b4fdd1340 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/io/PlatformSocket.kt @@ -1,10 +1,12 @@ package net.mamoe.mirai.utils.io +import io.ktor.network.selector.ActorSelectorManager import io.ktor.network.sockets.Socket import io.ktor.network.sockets.aSocket import io.ktor.network.sockets.openReadChannel import io.ktor.network.sockets.openWriteChannel import io.ktor.util.KtorExperimentalAPI +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.io.ByteReadChannel import kotlinx.coroutines.io.ByteWriteChannel import kotlinx.coroutines.io.readAvailable @@ -60,7 +62,7 @@ actual class PlatformSocket : Closeable { @UseExperimental(KtorExperimentalAPI::class) actual suspend fun connect(serverHost: String, serverPort: Int) { - socket = aSocket(io.ktor.network.selector.ActorSelectorManager(kotlinx.coroutines.Dispatchers.IO)).tcp().connect(serverHost, serverPort) + socket = aSocket(ActorSelectorManager(Dispatchers.IO)).tcp().connect(serverHost, serverPort) writeChannel = socket.openWriteChannel(true) readChannel = socket.openReadChannel() }