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

pol*_*olo 5 sockets tcp scala 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.什么是连接/区别

case Received(data) => 
    listener ! data
Run Code Online (Sandbox Code Playgroud)

case data: ByteString =>
    connection ! Write(data)
Run Code Online (Sandbox Code Playgroud)

yǝs*_*ǝla 8

回答你的问题:

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

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

发送ByteString到远程:

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

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

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

其中' - >'是一条消息发送.

  • 很好的解释!奇怪的是,我从doc描述本身并不了解整个过程. (2认同)