KSocketFactory.kt

  1. package org.knio.core.net

  2. import org.knio.core.context.KnioContext
  3. import org.knio.core.context.getKnioContext
  4. import java.io.IOException
  5. import java.net.InetAddress
  6. import java.net.InetSocketAddress
  7. import java.net.UnknownHostException

  8. interface KSocketFactory {
  9.     companion object {
  10.         suspend fun getDefault(): KSocketFactory {
  11.             return DefaultKSocketFactory(getKnioContext())
  12.         }
  13.     }

  14.     @Throws(IOException::class)
  15.     suspend fun createSocket(): KSocket

  16.     @Throws(IOException::class, UnknownHostException::class)
  17.     suspend fun createSocket(host: String, port: Int): KSocket

  18.     @Throws(IOException::class, UnknownHostException::class)
  19.     suspend fun createSocket(host: String, port: Int, localHost: InetAddress, localPort: Int): KSocket

  20.     @Throws(IOException::class)
  21.     suspend fun createSocket(host: InetAddress, port: Int): KSocket

  22.     @Throws(IOException::class)
  23.     suspend fun createSocket(address: InetAddress, port: Int, localAddress: InetAddress, localPort: Int): KSocket

  24.     private class DefaultKSocketFactory(
  25.         private val context: KnioContext
  26.     ): KSocketFactory {
  27.         override suspend fun createSocket() = KSocketImpl(
  28.             channel = context.channelFactory.openSocketChannel(),
  29.             context = context
  30.         )

  31.         override suspend fun createSocket(host: String, port: Int) =
  32.             createSocket().apply { connect(InetSocketAddress(host, port)) }

  33.         override suspend fun createSocket(host: String, port: Int, localHost: InetAddress, localPort: Int) = createSocket().apply {
  34.             bind(InetSocketAddress(localHost, localPort))
  35.             connect(InetSocketAddress(host, port))
  36.         }

  37.         override suspend fun createSocket(host: InetAddress, port: Int) = createSocket().apply {
  38.             connect(InetSocketAddress(host, port))
  39.         }

  40.         override suspend fun createSocket(address: InetAddress, port: Int, localAddress: InetAddress, localPort: Int) = createSocket().apply {
  41.             bind(InetSocketAddress(localAddress, localPort))
  42.             connect(InetSocketAddress(address, port))
  43.         }
  44.     }
  45. }