@@ -13,6 +13,8 @@ import io.ktor.utils.io.readLine
1313import io.ktor.utils.io.writeByte
1414import io.ktor.utils.io.writeFully
1515import kotlinx.coroutines.Dispatchers
16+ import kotlinx.coroutines.runBlocking
17+ import kotlinx.io.IOException
1618import java.net.InetAddress
1719
1820abstract class TcpStreamSocketKtorBase (
@@ -26,10 +28,12 @@ abstract class TcpStreamSocketKtorBase(
2628 protected var output: ByteWriteChannel ? = null
2729 protected var selectorManager = SelectorManager (Dispatchers .IO )
2830
29- abstract suspend fun onConnectSocket (timeout : Long ): ReadWriteSocket
31+ abstract suspend fun onConnectSocket (timeout : Long , error : ( Throwable ) -> Unit ): ReadWriteSocket
3032
3133 override suspend fun connect () {
32- val socket = onConnectSocket(timeout)
34+ val socket = onConnectSocket(timeout) {
35+ runBlocking { close() }
36+ }
3337 input = socket.openReadChannel()
3438 output = socket.openWriteChannel(autoFlush = false )
3539 address = java.net.InetSocketAddress (host, port).address
@@ -48,23 +52,23 @@ abstract class TcpStreamSocketKtorBase(
4852 }
4953
5054 override suspend fun write (bytes : ByteArray ) {
51- output?.writeFully(bytes)
55+ output?.writeFully(bytes) ? : throw IOException ( " Socket already closed " )
5256 }
5357
5458 override suspend fun write (bytes : ByteArray , offset : Int , size : Int ) {
55- output?.writeFully(bytes, offset, offset + size)
59+ output?.writeFully(bytes, offset, offset + size) ? : throw IOException ( " Socket already closed " )
5660 }
5761
5862 override suspend fun write (b : Int ) {
59- output?.writeByte(b.toByte())
63+ output?.writeByte(b.toByte()) ? : throw IOException ( " Socket already closed " )
6064 }
6165
6266 override suspend fun write (string : String ) {
6367 write(string.toByteArray())
6468 }
6569
6670 override suspend fun flush () {
67- output?.flush()
71+ output?.flush() ? : throw IOException ( " Socket already closed " )
6872 }
6973
7074 override suspend fun read (bytes : ByteArray ) {
0 commit comments