处理多个连接的 TCP 服务器

TCP server handling multiple connections

我正在尝试编写一个处理多个连接的 TCP 服务器。

我知道 Java 使用套接字的方式是它有一个线程池,服务器有一个等待连接的 while 循环,当 'accpets' 一个时 'gets'池中的一个线程来处理请求。 我在想象与演员类似的东西。

class TcpServer(remote: InetSocketAddress) extends Actor {

  import Tcp._
  import context.system

  IO(Tcp) ! Bind(self, remote)

  def receive = {
    case b @ Bound(localAddress) =>
      context.parent ! b

    case CommandFailed(_: Bind) ⇒ context stop self

    case c @ Connected(remote, local) =>
      val handler: ActorRef =  context.actorOf(RoundRobinPool(5).props(Props[SimplisticHandler]), "router")
      sender() ! Register(handler)
  }

但显然,这还不够。我在这里错过了什么?

对于 Akka TCP,通常使用的模式是让一个参与者处理连接。由于 actor 根据 ActorSystem 的调度程序的需要被调度到线程上,从线程池获取线程的模式或多或少由 Akka 自动提供(例如,可以将默认调度程序配置为是一个单线程池,但这不是默认的,也不推荐)。

考虑到这一点,您需要更换

context.actorOf(RoundRobinPool(5).props(Props[SimplisticHandler]), "router")

context.actorOf(Props[SimplisticHandler])

并确保在 SimplisticHandler

context.stop.self

响应 ConnectionClosed 消息。