7

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

这篇文章介绍了一个 TCP 客户端的简单实现,但我不清楚我将如何使用这个客户端。

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

  2. 伴生对象中的道具功能是什么?

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

4. 有什么联系/区别

case Received(data) => 
    listener ! data

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

1 回答 1

8

回答您的问题:

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

在这里总结一下 2-way 通信的样子。

发送ByteString到远程:

MyActor -> ByteString-> 客户端 -> Write(ByteString)-> 连接/远程

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

连接/远程 -> Received(ByteString)-> 客户端 -> ByteString-> MyActor

其中 '->' 是消息发送。

于 2015-11-17T03:15:40.183 回答