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
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容