Java Kotlin BufferedReader.readLine()导致无限循环
我正在Kotlin中制作简单的客户机-服务器应用程序。我遇到了BufferedReader.readLine()的问题。我的服务器发送几行文本,在读取它们之后,BufferedReader会阻止程序,这样它就不会继续了。看起来它仍在等待输入。我不知道如何修理它。 这是我的客户代码:Java Kotlin BufferedReader.readLine()导致无限循环,java,kotlin,bufferedreader,infinite-loop,readline,Java,Kotlin,Bufferedreader,Infinite Loop,Readline,我正在Kotlin中制作简单的客户机-服务器应用程序。我遇到了BufferedReader.readLine()的问题。我的服务器发送几行文本,在读取它们之后,BufferedReader会阻止程序,这样它就不会继续了。看起来它仍在等待输入。我不知道如何修理它。 这是我的客户代码: package Client import java.io.BufferedReader import java.io.IOException import java.io.InputStreamReader im
package Client
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader
import java.io.PrintWriter
import java.net.Socket
class ConnectionHandler(client : Socket) {
private val reader : BufferedReader = BufferedReader(InputStreamReader(client.getInputStream()))
private val writer : PrintWriter = PrintWriter(client.getOutputStream(), true)
private var running : Boolean = false
fun handle() {
running = true
while (running) {
read()
write()
}
}
private fun write(){
var intput: String? = readLine()
if (intput != null) {
writer.println(intput)
if(intput.toLowerCase() == "exit")
running = false
}
}
private fun read(){
var output : String? = "Server:"
while (output != null) {
println(output)
output = reader.readLine()
}
}
}
这是我的服务器代码:
package Server
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.PrintWriter
import java.net.Socket
class ClientHandler(private val client : Socket) {
private val reader : BufferedReader = client.getInputStream().bufferedReader()
private val writer : PrintWriter = PrintWriter(client.getOutputStream(), true)
private var running : Boolean = false
fun handle(){
running = true
writer.println("Welcome to Server")
writer.println("Possible operations: + - / *")
writer.println("Example input 1 + 2 (notice the spaces between signs)")
writer.println("To Exit write EXIT")
while (running){
try {
val text = reader.readLine()
if (text.toLowerCase() == "exit"){
shutdown()
continue
}
val values = text.split(" ")
val result = Calculator().calculate(values[0].toInt(), values[2].toInt(), values[1])
writer.println(" = $result" )
}catch (ex: Exception){
writer.println("Something went wrong, need to exit")
shutdown()
}
}
}
private fun shutdown(){
running = false;
writer.println("exit")
client.close()
println("${client.inetAddress.hostAddress} closed connection")
}
}
客户端读取最后一行“退出写入退出”,然后等待,并接受输入。
readLine()
将阻止并等待输入,并且仅当套接字关闭时才会返回null
。您需要调整客户端/服务器通信协议,以便服务器在完成写入时发送一个特殊标记,客户端在收到该标记时退出read
函数中的循环。readLine()。您需要调整客户端/服务器通信协议,以便服务器在完成写入时发送一个特殊标记,客户端在收到该标记时退出read
函数中的循环。好的,谢谢,关于这个标记,它可以像特殊的标记或文本,例如,如果我添加一行“EOF”当服务器完成编写时,可以吗?这是您的协议,您可以选择您需要的任何内容。“EOF”看起来不错。好的,谢谢,关于这个标记,它可以像特殊的符号或文本,例如,如果我在服务器完成写入时添加一行“EOF”,就可以了?这是您的协议,您可以选择您需要的任何内容。“EOF”看起来不错。