我正在尝试编写一个处理多个连接的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)
}
但是显然,这还不够。我在这里想念什么?
答案 0 :(得分:1)
对于Akka TCP,通常使用的模式是让一个参与者来处理连接。由于参与者根据ActorSystem
的调度程序被调度到线程上,因此Akka或多或少地自动提供了从线程池中获取线程的模式(例如,可以将默认调度程序配置为是一个单线程池,但这不是默认设置,也不建议这样做。)
考虑到这一点,您将要替换
context.actorOf(RoundRobinPool(5).props(Props[SimplisticHandler]), "router")
使用
context.actorOf(Props[SimplisticHandler])
并确保在SimplisticHandler
中
context.stop.self
响应ConnectionClosed
消息。