我如何为阻止的呼叫设置超时?

问题描述 投票:5回答:1

我有一个与多个客户端一起使用的多线程聊天服务器(每个客户端都在新线程中处理。)>

如果客户端断开连接,则服务器上的相关线程将挂在inputstream.readLine()上,这是一个阻塞调用。

如何设置某种超时方式,以便在2000ms后无响应地关闭套接字并释放线程?

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

我有一个与多个客户端一起使用的多线程聊天服务器(每个客户端都在新线程中处理)。如果客户端断开连接,则服务器上的相关线程将挂在inputstream上。...

scala sockets serversocket blocking
1个回答
5
投票

您可以使用BufferedReader.ready()

© www.soinside.com 2019 - 2024. All rights reserved.