才发现,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
}
}