mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-09 01:30:17 +08:00
Fix PlatformSocket on Android
This commit is contained in:
parent
a79032e8cd
commit
5ae4296bd5
@ -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()
|
||||
}
|
||||
}
|
@ -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()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user