Akka TCP 客户端:如何使用 akka actor 通过 TCP 发送消息

Akka TCP client: How can I send a message over TCP using akka actor

我想通过 TCP 发送文本消息。相当容易。我想用 akka 这样做。我读了这篇关于 akka IO 的文章: http://doc.akka.io/docs/akka/snapshot/scala/io-tcp.html

本文介绍了 TCP 客户端的简单实现,但我不清楚如何使用该客户端。

  1. 构造函数采用 InetSocketAddress 和 ActorRef。 InetSocketAddress 是有道理的(我假设这是目的地的地址)但是 ActorRef 是什么?这是我第一次使用 akka,但据我了解,ActorRef 是另一个演员的参考。由于我的 TCP 客户端是一个 actor,我希望这个 TCP actor 与 TCP 服务器通信,而不是与另一个 actor 通信,为什么我要给它一个 actor ref?

  2. 伴生对象中的 props 函数有什么用?

  3. 实例化后,我将如何使用此 actor 发送 TCP 消息?我应该只向它发送一条消息,其中包含我想以 ByteString 形式发送的数据吗?

4。

之间有什么联系/区别
case Received(data) => 
    listener ! data

case data: ByteString =>
    connection ! Write(data)

回答您的问题:

  1. 构造函数 class Client(remote: InetSocketAddress, listener: ActorRef) extends Actor 采用 listener,它是对使用此 Client 与远程服务器通信的参与者的引用。 Listener 将通过此 Client 发送和接收消息。由于 Client 是一个演员,您将仅通过发送消息与它交流。这同样适用于 Clientconnection/remote 通信时 - 它会代表您发送和接收消息,并将它们转发给您提供的 listener
  2. props actor 伴生对象中的函数 class 通常用作构建 actor 的辅助函数。如果您的 actor 接受构造函数参数并且您必须注意不要关闭可变状态,则需要它。请记住,您不能使用 new 运算符来创建演员,您必须调用 Props.
  3. 一旦连接到远程,您的 Client 演员将收到类型为 ByteString 的消息,如 case data: ByteString => 中。它会将数据写入 TCP 连接——有效地发送消息。每当它收到来自 Received 类型的远程响应(如 case Received(data) => 中)时,它会将其转发给您的 listener 演员。
  4. 参见 3。Client 参与者从您的 listenerconnection 接收消息并相应地转发它们。但是它不会检查它们来自哪里。因此,每当它收到 ByteString 时,它就会将其发送到 connection/remote,而每当它收到 Received 时,它就会将字节发送到 listener。如果您想进行双向通信,您需要确保您的听众可以收到这些消息。

这里总结一下双向通信的样子。

发送ByteString到远程:

MyActor -> ByteString -> 客户端 -> Write(ByteString) -> connection/remote

从远程接收 ByteString(服务器与客户端对话):

connection/remote -> Received(ByteString) -> 客户端 -> ByteString -> MyActor

其中“->”是消息发送。