处理多个连接的 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
消息。
我正在尝试编写一个处理多个连接的 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
消息。