【问题标题】:Kotlin BufferedReader.readLine() cause infinite loopKotlin BufferedReader.readLine() 导致无限循环
【发布时间】:2018-02-27 14:50:24
【问题描述】:

我正在 Kotlin 中制作简单的客户端 - 服务器应用程序。我遇到了 BufferedReader.readLine() 的问题。我的服务器发送了几行文本,并且在读取它们之后 BufferedReader 会阻止程序,因此它不会继续运行。看起来它仍在等待输入。我不知道如何解决它。 这是我的客户代码:

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

}

客户端读取最后一行“To Exit write EXIT”然后等待,接受输入。

【问题讨论】:

    标签: java kotlin bufferedreader infinite-loop readline


    【解决方案1】:

    readLine() 将阻塞并等待输入,只有在套接字关闭时才会返回null。您需要调整您的客户端/服务器通信协议,以便服务器在完成写入时发送一个特殊标记,并且客户端在收到该标记时退出read 函数中的循环。

    【讨论】:

    • 好的,谢谢,关于这个标记,它可以像特殊符号或文本,例如,如果我在服务器完成写入时添加一行“EOF”就可以了吗?
    • 这是你的协议,你可以选择任何你需要的。 “EOF”看起来不错。
    • 如果消息没有结束字符并且没​​有长度控制在你如何理解你阅读所有消息之前怎么办@yole
    猜你喜欢
    • 2020-08-27
    • 2021-05-07
    • 2012-08-24
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多