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客户端的简单实现,但我不清楚如何使用此客户端.
构造函数采用InetSocketAddress和ActorRef.InetSocketAddress是有道理的(我假设这是目的地),但是ActorRef是什么?这是我第一次使用akka,但据我所知,ActorRef是另一个actor的引用.由于我的TCP客户端是一个actor,我希望这个TCP actor与TCP服务器通信,而不是与另一个actor通信,为什么我会给它一个actor ref?
伴侣对象中的道具功能是什么?
一旦实例化,我将如何使用此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)
回答你的问题:
class Client(remote: InetSocketAddress, listener: ActorRef) extends Actor接受一个listener对正在使用它Client与远程服务器通信的actor的引用.监听器将通过此发送和接收消息Client.由于Client是演员,您将通过发送消息与其进行通信.这同样适用于Client与connection/ remote 通信的时间- 它将代表您发送和接收消息并将其转发给listener您提供的消息.propsactor类的伴随对象中的函数通常用作构造actor的辅助函数.如果你的actor接受构造函数参数而你必须注意不要关闭可变状态,那么它是必需的.记住你不能用newoperator来创建actor,你必须调用Props.Client演员会收到类型的消息ByteString,如case data: ByteString =>一旦连接到远程.它会将该数据写入TCP连接 - 有效地发送消息.每当它收到来自远程类型的响应时Received,case Received(data) =>它会将它转发给你的listener演员.Clientactor接收来自您listener和来自的消息connection并相应地转发它们.它不会检查它们来自何处.因此,无论何时收到ByteString它都会将其发送到connection/ remote,并且只要收到Received它就会发送字节listener.如果您想进行双向通信,则需要确保您的侦听器可以接收这些消息.这里总结一下双向通信的样子.
发送ByteString到远程:
MyActor - > ByteString- >客户端 - > Write(ByteString)- >连接/远程
ByteString从远程接收(服务器与客户端的对话):
连接/远程 - > Received(ByteString)- >客户端 - > ByteString- > MyActor
其中' - >'是一条消息发送.