This commit is contained in:
tursom 2020-05-18 20:52:30 +08:00
parent 797c7d24e6
commit 2ade0aa6d1
6 changed files with 17 additions and 11 deletions

View File

@ -9,6 +9,7 @@ import cn.tursom.core.timer.Timer
import cn.tursom.core.timer.WheelTimer
import cn.tursom.niothread.NioThread
import java.io.Closeable
import java.net.SocketAddress
import java.net.SocketException
import java.nio.channels.*
import java.nio.charset.Charset
@ -21,6 +22,7 @@ interface AsyncChannel : Closeable {
val key: SelectionKey
val nioThread: NioThread
val channel: SelectableChannel get() = key.channel()
val remoteAddress: SocketAddress
fun getBuffed(pool: MemoryPool): BufferedAsyncChannel = BufferedAsyncChannelImpl(pool, this)
private inline fun <T> operate(action: () -> T): T {

View File

@ -1,6 +1,7 @@
package cn.tursom.datagram
import cn.tursom.niothread.NioThread
import java.net.SocketAddress
import java.nio.channels.DatagramChannel
import java.nio.channels.SelectionKey
@ -10,7 +11,7 @@ open class NioDatagram(
override val nioThread: NioThread
) : AsyncDatagram {
override val open: Boolean get() = channel.isOpen && key.isValid
override val remoteAddress: SocketAddress get() = channel.remoteAddress
override fun writeMode() {}
override suspend fun <T> write(timeout: Long, action: () -> T): T {

View File

@ -3,12 +3,10 @@ package cn.tursom.datagram.server
import cn.tursom.core.pool.MemoryPool
import cn.tursom.datagram.AsyncDatagram
import cn.tursom.datagram.BufferedAsyncDatagram
import java.net.SocketAddress
class BufferedServerNioDatagram(override val pool: MemoryPool, override val prevChannel: ServerNioDatagram) :
BufferedAsyncDatagram,
AsyncDatagram by prevChannel {
val remoteAddress: SocketAddress get() = prevChannel.remoteAddress
override fun toString(): String {
return "BufferedServerNioDatagram(pool=$pool, prevChannel=$prevChannel)"
}

View File

@ -17,7 +17,7 @@ import kotlin.coroutines.resumeWithException
import kotlin.coroutines.suspendCoroutine
class ServerNioDatagram(
val remoteAddress: SocketAddress,
override val remoteAddress: SocketAddress,
val server: AsyncDatagramServer,
channel: DatagramChannel,
key: SelectionKey,

View File

@ -6,6 +6,7 @@ import cn.tursom.core.buffer.ByteBuffer
import cn.tursom.core.buffer.read
import cn.tursom.core.buffer.write
import cn.tursom.core.pool.MemoryPool
import java.net.SocketAddress
import java.net.SocketException
import java.nio.channels.FileChannel
import java.nio.channels.SocketChannel
@ -13,6 +14,7 @@ import java.nio.channels.SocketChannel
@Suppress("unused")
interface AsyncSocket : AsyncChannel {
override val channel: SocketChannel
override val remoteAddress: SocketAddress get() = channel.remoteAddress
override fun getBuffed(pool: MemoryPool): BufferedAsyncChannel = BufferedNioSocket(this, pool)
override suspend fun write(buffer: Array<out ByteBuffer>, timeout: Long): Long =

View File

@ -1,20 +1,23 @@
package cn.tursom.datagram.server
import cn.tursom.channel.BufferedAsyncChannel
import cn.tursom.core.log
import cn.tursom.core.pool.DirectMemoryPool
import cn.tursom.datagram.AsyncDatagramClient
import kotlinx.coroutines.runBlocking
val echoHandler: suspend BufferedAsyncChannel.() -> Unit = {
while (true) {
val buffer = read()
log("$this recv from client $remoteAddress: ${buffer.toString(buffer.readable)}")
write(buffer)
}
}
fun main() {
val port = 12345
val pool = DirectMemoryPool(1024, 16)
val server = BufferedAsyncDatagramServer(port, pool) {
while (true) {
val buffer = read()
log("$this recv from client $remoteAddress: ${buffer.toString(buffer.readable)}")
write(buffer)
}
}
val server = BufferedAsyncDatagramServer(port, pool, echoHandler)
//val server = LoopDatagramServer(port, protocol = object : NioProtocol {
// override fun handleRead(key: SelectionKey, nioThread: NioThread) {
// val datagramChannel = key.channel() as DatagramChannel