首页 > 解决方案 > 如何在 Kotlin 中添加客户端和服务器之间的反馈?

问题描述

我正在用 Kotlin 编写一个简单的客户端 - 服务器。从服务器向客户端发送数据时出现问题。服务器:没有“writer”一切正常,消息来自客户端客户端:没有“reader”一切正常,服务器接受消息。一旦我尝试向服务器和客户端添加“反馈”,一切都会立即停止工作。

我知道需要关闭流,但我不明白究竟是什么时候。我尝试了很多选择 - 它不起作用

服务器:

import java.net.ServerSocket
import java.util.*

fun main() {
    val server = ServerSocket(9000)
    val client = server.accept()

    val reader = Scanner(client.getInputStream())
    val writer = client.getOutputStream()

    print(reader.nextLine())

    writer.write("Yes".toByteArray())
    writer.flush()
}

客户

import java.net.Socket
import java.util.*

fun main() {
    val client = Socket("192.168.1.8", 9000)
    var writer = client.getOutputStream()
    var reader = Scanner(client.getInputStream())

    writer.write("Hi".toByteArray())
    writer.flush()

    print(reader.nextLine())
}

标签: kotlin

解决方案


看起来您在两条消息中都缺少换行符,因此reader.nextLine()永远不会返回的呼叫,因为尚未完全收到“下一行”。使用时,nextLine()您需要将通信协议视为“换行符分隔消息”。

请注意,这也意味着您的消息中不能有换行符。如果您需要更复杂的消息,您可能需要考虑使用 base 64 编码消息内容。

使用低级套接字协议可能非常具有挑战性,使用像 HTTP 这样的高级协议会增加复杂性,但在某些方面也可以更简单。

如果您需要使用套接字,您最好一次读取一个字节并实现一个状态机来处理要输出的字节,尽管这比调用nextLine().

以下代码适用于我:

服务器:

import java.net.ServerSocket
import java.util.*

fun main() {
    val server = ServerSocket(9000)
    val client = server.accept()

    val reader = Scanner(client.getInputStream())
    val writer = client.getOutputStream()

    print(reader.nextLine())

    writer.write("Yes\n".toByteArray()) // <<<<<< Added \n
    writer.flush()
}

客户:

import java.net.Socket
import java.util.*

fun main() {
    val client = Socket("127.0.0.1", 9000) // << Also changed to localhost IP.
    var writer = client.getOutputStream()
    var reader = Scanner(client.getInputStream())

    writer.write("Hi\n".toByteArray())  // <<<<< Added \n
    writer.flush()

    print(reader.nextLine())
}

推荐阅读