android kotlin socket 阻塞

才發現,socket read 方法,包括readline ,都是阻塞方式,如果服務器不斷開輸出流,客戶端是讀取不到 結束符的(換行/-1)。
研究了好久,才知道怎么搞。直接上CODE。

private suspend fun getMsg(): String {
        if (readStream == null) {
            return ""
        }
        return withTimeoutOrNull(1500) {
            val sb = StringBuffer()
            while (isActive) {
                while (readStream?.ready() != true) {
                    delay(10)
                }
                val char = CharArray(1024)
                var readLength = 0
                while (readStream?.ready() == true) {
                    readLength = readStream!!.read(char)
                    sb.append(char.copyOf(readLength))
                }
                break
            }
            sb.toString()
        } ?: ""
    }

很簡單對不對,就是主要依靠 ready來退出讀循環。

2024年12月19日13:06:02

Socket(ipStr,port)

這樣寫是不對的,如果地址有問題,是會阻塞的,用什么協程 timeout 也不好使。
要使用

  private fun doRealConnect() {
        sc = Socket().apply {
            connect(InetSocketAddress(ipStr, iport), 1500)
        }

        sc?.let {
            writerStream = OutputStreamWriter(it.getOutputStream(), "utf-8")
            readStream = InputStreamReader(it.getInputStream(), "utf-8")
            it.soTimeout = 10000
        }
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容