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

8
我想通过TCP发送文本消息,使用akka实现。我阅读了关于akka IO的文章:http://doc.akka.io/docs/akka/snapshot/scala/io-tcp.html。文章中提供了一个简单的TCP客户端实现,但我不清楚如何使用该客户端。
1. 构造函数接受一个InetSocketAddress和一个ActorRef。InetSocketAddress是目标地址(我假设是这样),但ActorRef是什么?这是我第一次使用akka,但据我所知,ActorRef是另一个actor的引用。由于我的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个回答

9

回答你的问题:

  1. class Client(remote: InetSocketAddress, listener: ActorRef) extends Actor 的构造函数接受一个 listener,它是一个引用,指向使用这个 Client 与远程服务器通信的 actor。Listener 将通过这个 Client 发送和接收消息。由于 Client 是一个 actor,您将仅通过发送消息与其通信。当 Clientconnection/远程通信时,它也会代表您发送和接收消息,并将其转发到您提供的 listener
  2. actor 类的 companion object 中的 props 函数通常用作构造 actor 的辅助函数。如果您的 actor 接受构造函数参数,则需要注意不要关闭可变状态。请记住,您不能使用 new 运算符创建 actor,必须调用 Props
  3. 连接到远程后,您的 Client actor 将接收类型为 ByteString 的消息,例如 case data: ByteString =>。它将把该数据写入 TCP 连接 - 实际上是发送一条消息。每当它从远程接收到类型为 Received 的响应,例如 case Received(data) =>,它将转发给您的 listener actor。
  4. 请参见第三点。您的 Client actor 将根据需要从您的 listenerconnection 接收消息并相应地转发它们。但是,它不会检查它们来自何处。因此,每当它接收到 ByteString 时,它将向 connection/远程发送它,并且每当它接收到 Received 时,它将向 listener 发送字节。如果您希望进行双向通信,则需要确保您的 listener 可以接收这些消息。

总结一下,这就是双向通信的样子。

向远程发送 ByteString

MyActor -> ByteString -> Client -> Write(ByteString) -> connection/remote

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

connection/remote -> Received(ByteString) -> Client -> ByteString -> MyActor

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


2
很好的解释!奇怪的是我没有从文档描述中完全理解整个过程。 - Nikita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接