如何在 Kotlin 中添加客户端和服务器之间的反馈?



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

我知道流需要关闭,但我无法理解究竟在什么时候。我尝试了很多选择 - 它不起作用

服务器:

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())
}

看起来您在两条消息中都缺少换行符,因此对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("Yesn".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("Hin".toByteArray())  // <<<<< Added n
writer.flush()
print(reader.nextLine())
}

相关内容

最新更新