0

我正在尝试为 wifi 设备构建一个客户端作为服务器。我使用ktor-network 客户端文档作为参考,它显示客户端实现如下,非常简单。

fun main(args: Array<String>) {
    runBlocking {
        val socket = aSocket(ActorSelectorManager(Dispatchers.IO)).tcp().connect(InetSocketAddress("127.0.0.1", 2323))
        val input = socket.openReadChannel()
        val output = socket.openWriteChannel(autoFlush = true)

        output.write("hello\r\n")
        val response = input.readUTF8Line()
        println("Server said: '$response'")
    }
}

但问题是当我尝试字符串常量output.write(USERNAME)在哪里时。USERNAME尽管我使用 write 方法进行了测试,但IDE 显示了 write 函数的已弃用警告,但服务器也没有给出任何响应。我浏览了文档,它建议使用 writeFully 而不是 write。所以我做了更改并测试它仍然没有成功。所需的输出是服务器给出响应“密码:”但没有返回任何内容。

服务器端没有问题,因为它在 iOS 实现中工作。

这是我的套接字客户端的实现:

runBlocking {
    val socket = aSocket(ActorSelectorManager(Dispatchers.IO)).tcp()
        .connect(InetSocketAddress(IP, PORT))

    input = socket.openReadChannel()
    output = socket.openWriteChannel(autoFlush = true)

    while (!socket.isClosed) {
        val response = input.readUTF8Line()
        Timber.e("Server said: '$response'")

        when(response){
            "login:"->{
                output.writeFully(USERNAME.toByteArray(Charsets.UTF_8))
            }
            "password:"->{
                output.writeFully(PASSWORD)
            }
        }

        delay(1000)
    }

    Timber.e("Stopped'")

}}catch (e: ConnectException){
    Timber.e(e)
}

我已经尝试过ByteWriteChannel(输出实例的类)类的这些方法:write(string), writeFully(byteArray)& writeStringUtf8(string)。没有工作!

你能帮我看看这里出了什么问题或者有什么办法可以解决这个问题吗?

4

1 回答 1

0

利用output.writeAvailable("$line\r\n".toByteArray())

他们只是更改了 API - 这会将字符串的所有字节写入输出。

于 2022-01-03T20:07:50.187 回答