Как я могу установить тайм-аут для блокировки вызова? - PullRequest
5 голосов
/ 22 декабря 2019

У меня есть многопоточный сервер чата, работающий с несколькими клиентами (каждый клиент обрабатывается в новом потоке).

Если клиент отключается, соответствующий поток на сервере зависает на inputtream.readLine () который является блокирующим вызовом.

Как я могу установить какое-то время ожидания, чтобы я мог закрыть сокет и освободить поток через 2000 мс без ответа?

class Handler(socket: Socket) extends Runnable {
  def run() : Unit = {
    val inputstream = new BufferedReader(new InputStreamReader(socket.getInputStream()))
    val outputstream = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))
    var break = false
    while(break != true){
      val input = inputstream.readLine() // blocking call
// how do i time out after 2000ms?
      input match {
        case "update" =>
          outputstream.write("message")
          outputstream.newLine()
          outputstream.flush()
        case _ => // any other input, break and close socket
          break = true
      }
    }
    socket.close()
  }
}

object ChatServer extends App {
  val server = new ServerSocket(10000)
  while(true) {
    val socket = server.accept // blocking call
    (new Thread(new Handler(socket))).start()
    // some condition{
    //   server.close()
    // }
  }
}
...