TCP服务器处理多个连接

时间:2019-06-21 10:19:57

标签: scala akka actor

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

我知道Java使用套接字进行处理的方式是,它有一个线程池,服务器有一个while循环等待连接,当“请求”一个线程时,它从池中“获取”线程来处理请求。 我当时正在和演员们描绘类似的东西。

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

但是显然,这还不够。我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

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

考虑到这一点,您将要替换

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

使用

context.actorOf(Props[SimplisticHandler])

并确保在SimplisticHandler

context.stop.self

响应ConnectionClosed消息。