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

时间:2015-11-17 01:54:41

标签: scala sockets tcp akka akka-io

我想通过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. 伴侣对象中的道具功能是什么?

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

  4. 4。

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

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

1 个答案:

答案 0 :(得分:7)

回答你的问题:

  1. 构造函数class Client(remote: InetSocketAddress, listener: ActorRef) extends Actor使用listener,它是对使用此Client与远程服务器通信的actor的引用。监听器将通过此Client发送和接收消息。由于Client是演员,因此您只需通过发送消息与其进行通信。 Clientconnection / remote通信时也是如此 - 它会代表您发送和接收邮件,并将其转发给您提供的listener
  2. actor类的伴随对象中的
  3. props函数通常用作构造actor的辅助函数。如果你的actor接受构造函数参数而你必须注意不要关闭可变状态,那么它是必需的。请记住,您无法使用new运算符创建演员,您必须调用Props
  4. 一旦连接到遥控器,您的Client演员将收到ByteString类型的消息,如case data: ByteString =>中所示。它会将该数据写入TCP连接 - 有效地发送消息。每当它收到Received类型的远程响应,就像在case Received(data) =>中一样,它会将其转发给您的listener演员。
  5. 请参阅3. Client actor接收来自listenerconnection的消息并相应地转发。它不会检查它们来自何处。因此,只要收到ByteString,它就会将其发送到connection / remote,每当收到Received时,它都会向listener发送字节。如果您希望进行双向通信,则需要确保您的侦听器可以接收这些消息。
  6. 这里总结一下双向沟通的方式。

    ByteString发送到远程:

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

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

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

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