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
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 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 {
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 suspend inline fun send(packet: ByteReadPacket): Boolean = withContext(Dispatchers.IO) {
try {
(channel as ReadableByteChannel).read(buffer)
(channel as WritableByteChannel).writePacket(packet)
} catch (e: Throwable) {
throw ReadPacketInternalException(e)
throw SendPacketInternalException(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)
}
actual suspend inline fun read(): ByteReadPacket = withContext(Dispatchers.IO) {
try {
(channel as ReadableByteChannel).readPacketAtMost(Long.MAX_VALUE)
} catch (e: Throwable) {
throw ReadPacketInternalException(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
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
}
......
......@@ -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 ReadPacketInternalException(e)
throw SendPacketInternalException(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)
}
actual suspend inline fun read(): ByteReadPacket = withContext(Dispatchers.IO) {
try {
(channel as ReadableByteChannel).readPacketAtMost(Long.MAX_VALUE)
} catch (e: Throwable) {
throw ReadPacketInternalException(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 {
......
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