【问题标题】:TCP/IP Client in Kotlin that does not wait forever for server messageKotlin 中的 TCP/IP 客户端不会永远等待服务器消息
【发布时间】:2022-08-16 09:42:48
【问题描述】:

我在下面的 Kotlin 中有简单的 TCP/IP 客户端代码。 此代码有效。 客户端打开套接字并永远循环,首先向服务器发送消息,然后永远等待服务器的响应。 我知道这段代码不是很好,永远循环,保持套接字连接打开等,但它现在只是用于测试目的。

 fun tcp_client() {
    thread {
        val client1 = Socket(SERVER_IP_ADDRESS, SERVER_IP_PORT)
        val output1 = PrintWriter(client1.getOutputStream(), true)
        val input1 = BufferedReader(InputStreamReader(client1.inputStream))

        while (true) {
                output1.println(str_user_text)
                str_rcvd_data = input1.readLine()
        }
    }
    client1.close()
}

该行:

str_rcvd_data = input1.readLine()

永远等待服务器响应。

我的问题:是否可以修改此代码以便客户端执行不是永远等待服务器响应?像这样的东西:

If (server data received) {
    // process the data
} else {
    // do something else for now and check again in a short while
}

在此先感谢您的任何建议

加勒特

标签: kotlin tcpclient


【解决方案1】:

我最终解决了这个问题 - 我不确定这个解决方案有多“正确”,但它对我有用:

正在连接服务器......

如果无法连接,我的旧代码会挂起,因为使用 IP 地址和端口对 Socket() 的调用是阻塞调用 - 即永远等待:

val client1 = Socket(SERVER_IP_ADDRESS, SERVER_IP_PORT)

所以我用这个替换了代码:

try {
    client1 = Socket()
    client1.connect(InetSocketAddress(SERVER_IP_ADDRESS, SERVER_IP_PORT), 3000)
    output1 = DataOutputStream (client1.getOutputStream())
    input1 = DataInputStream (client1.getInputStream())
} catch (ex : Exception) {
    // do something
} finally {
    // do something
}

这并不完美,但它有效。

为了读取数据,我的旧代码 readline() 阻塞:

str_rcvd_data = input1.readLine()

现在,我的代码首先检查是否有任何数据,然后抓取每个字节

iRxDataAvailable = input1.available()
while (iRxDataAvailable > 0)
{
    iRxDataAvailable--
    // Take a copy of the received byte
    byRcvdByte = input1.readByte()
    // Do something with this data byte...
}

最后,向服务器发送数据,将数据放入字节数组中,然后:

output1.write(byArray)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-06
    • 2014-09-08
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多