KSocketFactory.kt
package org.knio.core.net
import org.knio.core.context.KnioContext
import org.knio.core.context.getKnioContext
import java.io.IOException
import java.net.InetAddress
import java.net.InetSocketAddress
import java.net.UnknownHostException
interface KSocketFactory {
companion object {
suspend fun getDefault(): KSocketFactory {
return DefaultKSocketFactory(getKnioContext())
}
}
@Throws(IOException::class)
suspend fun createSocket(): KSocket
@Throws(IOException::class, UnknownHostException::class)
suspend fun createSocket(host: String, port: Int): KSocket
@Throws(IOException::class, UnknownHostException::class)
suspend fun createSocket(host: String, port: Int, localHost: InetAddress, localPort: Int): KSocket
@Throws(IOException::class)
suspend fun createSocket(host: InetAddress, port: Int): KSocket
@Throws(IOException::class)
suspend fun createSocket(address: InetAddress, port: Int, localAddress: InetAddress, localPort: Int): KSocket
private class DefaultKSocketFactory(
private val context: KnioContext
): KSocketFactory {
override suspend fun createSocket() = KSocketImpl(
channel = context.channelFactory.openSocketChannel(),
context = context
)
override suspend fun createSocket(host: String, port: Int) =
createSocket().apply { connect(InetSocketAddress(host, port)) }
override suspend fun createSocket(host: String, port: Int, localHost: InetAddress, localPort: Int) = createSocket().apply {
bind(InetSocketAddress(localHost, localPort))
connect(InetSocketAddress(host, port))
}
override suspend fun createSocket(host: InetAddress, port: Int) = createSocket().apply {
connect(InetSocketAddress(host, port))
}
override suspend fun createSocket(address: InetAddress, port: Int, localAddress: InetAddress, localPort: Int) = createSocket().apply {
bind(InetSocketAddress(localAddress, localPort))
connect(InetSocketAddress(address, port))
}
}
}