我想通过TCP发送文本消息。满容易。我想用akka这样做。我读了这篇关于akka IO的文章: http://doc.akka.io/docs/akka/snapshot/scala/io-tcp.html
本文介绍了TCP客户端的简单实现,但我不清楚如何使用此客户端。
构造函数采用InetSocketAddress和ActorRef。 InetSocketAddress是有意义的(我假设这是目的地),但是ActorRef是什么?这是我第一次使用akka,但据我所知,ActorRef是另一个actor的引用。由于我的TCP客户端是一个actor,我希望这个TCP actor与TCP服务器通信,而不是与另一个actor通信,为什么我会给它一个actor ref?
伴侣对象中的道具功能是什么?
一旦实例化,我将如何使用此actor发送TCP消息?我应该以ByteString的形式发送一条包含我想要发送的数据的消息吗?
4。
之间的联系/区别是什么case Received(data) =>
listener ! data
和
case data: ByteString =>
connection ! Write(data)
答案 0 :(得分:7)
回答你的问题:
class Client(remote: InetSocketAddress, listener: ActorRef) extends Actor
使用listener
,它是对使用此Client
与远程服务器通信的actor的引用。监听器将通过此Client
发送和接收消息。由于Client
是演员,因此您只需通过发送消息与其进行通信。 Client
与connection
/ remote通信时也是如此 - 它会代表您发送和接收邮件,并将其转发给您提供的listener
。props
函数通常用作构造actor的辅助函数。如果你的actor接受构造函数参数而你必须注意不要关闭可变状态,那么它是必需的。请记住,您无法使用new
运算符创建演员,您必须调用Props
。Client
演员将收到ByteString
类型的消息,如case data: ByteString =>
中所示。它会将该数据写入TCP连接 - 有效地发送消息。每当它收到Received
类型的远程响应,就像在case Received(data) =>
中一样,它会将其转发给您的listener
演员。Client
actor接收来自listener
和connection
的消息并相应地转发。它不会检查它们来自何处。因此,只要收到ByteString
,它就会将其发送到connection
/ remote,每当收到Received
时,它都会向listener
发送字节。如果您希望进行双向通信,则需要确保您的侦听器可以接收这些消息。这里总结一下双向沟通的方式。
将ByteString
发送到远程:
MyActor - > ByteString
- >客户 - > Write(ByteString)
- >连接/远程强>
从远程接收ByteString
(服务器与客户端对话):
连接/远程 - > Received(ByteString)
- >客户 - > ByteString
- > MyActor 强>
其中' - >'是一个消息发送。