才發(fā)現(xiàn)涡尘,socket read 方法忍弛,包括readline ,都是阻塞方式考抄,如果服務(wù)器不斷開輸出流细疚,客戶端是讀取不到 結(jié)束符的(換行/-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來退出讀循環(huán)镇防。
2024年12月19日13:06:02
Socket(ipStr,port)
這樣寫是不對的潮饱,如果地址有問題来氧,是會阻塞的,用什么協(xié)程 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
}
}