kotlin - 如何在 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())
}
解决方案
看起来您在两条消息中都缺少换行符,因此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())
}
推荐阅读
- reactjs - ReactJs如何从表中删除一行?
- java - 使用 javaFX setOnAction 返回
- python - 如何在熊猫数据框行中获取最后五个连续值?
- node.js - 如何在 nodejs 中设置 websocket 以将 console.logs 发送到浏览器
- floating-point - 是否应该将低于机器精度的矩阵条目切为零?
- api - Azure Key Vault Rest API 获取密钥 401
- jpa - Spring JPA - 链接 2 个没有父子关系的表
- python - 我怎么知道 Keras 正在优化我的自定义损失函数中的正确值?
- python - 你如何在记事本中执行 .py 文件?
- r - 向 paste0 中的数据框添加新列