在套接字响应

时间:2017-06-13 14:56:43

标签: java sockets io kotlin

所以说我有一个从套接字连接返回的流。使用'\ 0'返回的流终止,但在kotlin中我似乎无法以相同的方式工作。下面的代码是用Java编写的,我可能只是看起来很简单。

public final String readUpToNull(InputStream inputStream) throws IOException {
    StringBuilder builder = new StringBuilder();
    char ch;
    while ((ch = (char) inputStream.read()) != '\0') {
        builder.append(ch);
    }
    return builder.toString();
}

如果有人知道如何在与Kotlin中的流与套接字通信时这样做。这里的另一篇文章是阅读完整的文本字符串。套接字返回由'\ 0'分隔的较长字符串。所以问题是我需要能够加载第一个字符串然后加载第二个字符串。

Example

Server : hello\0 xml stuff all right here\0
Client: read hello
Client: read xml stuff all right here

来自kotlinlang.org的示例代码将此作为使用Java to Kotlin转换器的解决方案。请注意,由于while语句中的赋值,此代码无法编译。

@Throws(IOException::class)
fun readUpToNull(inputStream:InputStream):String {
    val builder = StringBuilder()
    val ch:Char
    while ((ch = inputStream.read() as Char) != '\u0000')
    {
      builder.append(ch)
    }
    return builder.toString()
}

这是我到目前为止所做的,但是这个实现只是挂起进程并锁定了API调用的单元测试。

fun readUpToNull(stream: InputStream): String {
    val reader = BufferedReader(InputStreamReader(stream))
    val builder = StringBuilder()
    while (true) {
        val characters = reader.readText().toCharArray()
        characters.takeWhile { it != '\u0000' }.forEach { builder.append(it) }
        break
    }
    return builder.toString()
}

1 个答案:

答案 0 :(得分:1)

这里有一个或多或少直接的Java代码到Kotlin的翻译:

fun readUpToNull(inputStream: InputStream): String {
    return buildString {
        while (true) {
            val ch = inputStream.read().toChar()
            if (ch == '\u0000') break
            append(ch)
        }
    }
}