Commit 9bc3d933 authored by Him188's avatar Him188

Rewrite PlatformDatagramChannel, easier to use

parent f5261b25
...@@ -2,43 +2,42 @@ package net.mamoe.mirai.utils.io ...@@ -2,43 +2,42 @@ package net.mamoe.mirai.utils.io
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Closeable import kotlinx.io.core.Closeable
import kotlinx.io.core.IoBuffer import kotlinx.io.nio.readPacketAtMost
import kotlinx.io.nio.read import kotlinx.io.nio.writePacket
import java.net.InetSocketAddress import java.net.InetSocketAddress
import java.nio.channels.DatagramChannel import java.nio.channels.DatagramChannel
import java.nio.channels.ReadableByteChannel import java.nio.channels.ReadableByteChannel
import java.nio.channels.WritableByteChannel
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 class PlatformDatagramChannel actual constructor(serverHost: String, serverPort: Short) : Closeable { actual suspend inline fun send(packet: ByteReadPacket): Boolean = withContext(Dispatchers.IO) {
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) {
try { try {
(channel as WritableByteChannel).writePacket(packet)
(channel as ReadableByteChannel).read(buffer)
} catch (e: Throwable) { } catch (e: Throwable) {
throw ReadPacketInternalException(e) throw SendPacketInternalException(e)
} }
} }
@Throws(SendPacketInternalException::class) actual suspend inline fun read(): ByteReadPacket = withContext(Dispatchers.IO) {
actual suspend fun send(buffer: IoBuffer) = withContext(Dispatchers.IO) { try {
buffer.readDirect { (channel as ReadableByteChannel).readPacketAtMost(Long.MAX_VALUE)
try { } catch (e: Throwable) {
channel.send(it, serverAddress) throw ReadPacketInternalException(e)
} catch (e: Throwable) {
throw SendPacketInternalException(e)
}
} }
} }
}
override fun close() { \ No newline at end of file
channel.close()
}
actual val isOpen: Boolean get() = channel.isOpen
}
actual typealias ClosedChannelException = java.nio.channels.ClosedChannelException
\ No newline at end of file
package net.mamoe.mirai.utils.io package net.mamoe.mirai.utils.io
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Closeable import kotlinx.io.core.Closeable
import kotlinx.io.core.IoBuffer
import kotlinx.io.errors.IOException import kotlinx.io.errors.IOException
import net.mamoe.mirai.utils.MiraiInternalAPI
/** /**
* 多平台适配的 DatagramChannel. * 多平台适配的 DatagramChannel.
*/ */
@MiraiInternalAPI
expect class PlatformDatagramChannel(serverHost: String, serverPort: Short) : Closeable { 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 val isOpen: Boolean
} }
......
...@@ -2,49 +2,47 @@ package net.mamoe.mirai.utils.io ...@@ -2,49 +2,47 @@ package net.mamoe.mirai.utils.io
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Closeable import kotlinx.io.core.Closeable
import kotlinx.io.core.IoBuffer import kotlinx.io.nio.readPacketAtMost
import kotlinx.io.nio.read import kotlinx.io.nio.writePacket
import java.net.InetSocketAddress import java.net.InetSocketAddress
import java.nio.channels.DatagramChannel import java.nio.channels.DatagramChannel
import java.nio.channels.ReadableByteChannel 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 typealias ClosedChannelException = java.nio.channels.ClosedChannelException
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 { try {
(channel as ReadableByteChannel).read(buffer) (channel as WritableByteChannel).writePacket(packet)
} catch (e: ClosedChannelException) {
throw e
} catch (e: Throwable) { } catch (e: Throwable) {
throw ReadPacketInternalException(e) throw SendPacketInternalException(e)
} }
} }
@Throws(SendPacketInternalException::class) actual suspend inline fun read(): ByteReadPacket = withContext(Dispatchers.IO) {
actual suspend fun send(buffer: IoBuffer) = withContext(Dispatchers.IO) { try {
buffer.readDirect { (channel as ReadableByteChannel).readPacketAtMost(Long.MAX_VALUE)
try { } catch (e: Throwable) {
channel.send(it, serverAddress) throw ReadPacketInternalException(e)
} 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 { actual class PlatformDatagramChannel actual constructor(serverHost: String, serverPort: Short) : Closeable {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment