Akka TCP 客户端:如何使用 akka actor 通过 TCP 发送消息
Akka TCP client: How can I send a message over TCP using akka actor
我想通过 TCP 发送文本消息。相当容易。我想用 akka 这样做。我读了这篇关于 akka IO 的文章:
http://doc.akka.io/docs/akka/snapshot/scala/io-tcp.html
本文介绍了 TCP 客户端的简单实现,但我不清楚如何使用该客户端。
构造函数采用 InetSocketAddress 和 ActorRef。 InetSocketAddress 是有道理的(我假设这是目的地的地址)但是 ActorRef 是什么?这是我第一次使用 akka,但据我了解,ActorRef 是另一个演员的参考。由于我的 TCP 客户端是一个 actor,我希望这个 TCP actor 与 TCP 服务器通信,而不是与另一个 actor 通信,为什么我要给它一个 actor ref?
伴生对象中的 props 函数有什么用?
实例化后,我将如何使用此 actor 发送 TCP 消息?我应该只向它发送一条消息,其中包含我想以 ByteString 形式发送的数据吗?
4。
之间有什么联系/区别
case Received(data) =>
listener ! data
和
case data: ByteString =>
connection ! Write(data)
回答您的问题:
- 构造函数
class Client(remote: InetSocketAddress, listener: ActorRef) extends Actor
采用 listener
,它是对使用此 Client
与远程服务器通信的参与者的引用。 Listener 将通过此 Client
发送和接收消息。由于 Client
是一个演员,您将仅通过发送消息与它交流。这同样适用于 Client
与 connection
/remote 通信时 - 它会代表您发送和接收消息,并将它们转发给您提供的 listener
。
props
actor 伴生对象中的函数 class 通常用作构建 actor 的辅助函数。如果您的 actor 接受构造函数参数并且您必须注意不要关闭可变状态,则需要它。请记住,您不能使用 new
运算符来创建演员,您必须调用 Props
.
- 一旦连接到远程,您的
Client
演员将收到类型为 ByteString
的消息,如 case data: ByteString =>
中。它会将数据写入 TCP 连接——有效地发送消息。每当它收到来自 Received
类型的远程响应(如 case Received(data) =>
中)时,它会将其转发给您的 listener
演员。
- 参见 3。
Client
参与者从您的 listener
和 connection
接收消息并相应地转发它们。但是它不会检查它们来自哪里。因此,每当它收到 ByteString
时,它就会将其发送到 connection
/remote,而每当它收到 Received
时,它就会将字节发送到 listener
。如果您想进行双向通信,您需要确保您的听众可以收到这些消息。
这里总结一下双向通信的样子。
发送ByteString
到远程:
MyActor -> ByteString
-> 客户端 -> Write(ByteString)
-> connection/remote
从远程接收 ByteString
(服务器与客户端对话):
connection/remote -> Received(ByteString)
-> 客户端 -> ByteString
-> MyActor
其中“->”是消息发送。
我想通过 TCP 发送文本消息。相当容易。我想用 akka 这样做。我读了这篇关于 akka IO 的文章: http://doc.akka.io/docs/akka/snapshot/scala/io-tcp.html
本文介绍了 TCP 客户端的简单实现,但我不清楚如何使用该客户端。
构造函数采用 InetSocketAddress 和 ActorRef。 InetSocketAddress 是有道理的(我假设这是目的地的地址)但是 ActorRef 是什么?这是我第一次使用 akka,但据我了解,ActorRef 是另一个演员的参考。由于我的 TCP 客户端是一个 actor,我希望这个 TCP actor 与 TCP 服务器通信,而不是与另一个 actor 通信,为什么我要给它一个 actor ref?
伴生对象中的 props 函数有什么用?
实例化后,我将如何使用此 actor 发送 TCP 消息?我应该只向它发送一条消息,其中包含我想以 ByteString 形式发送的数据吗?
4。
之间有什么联系/区别case Received(data) =>
listener ! data
和
case data: ByteString =>
connection ! Write(data)
回答您的问题:
- 构造函数
class Client(remote: InetSocketAddress, listener: ActorRef) extends Actor
采用listener
,它是对使用此Client
与远程服务器通信的参与者的引用。 Listener 将通过此Client
发送和接收消息。由于Client
是一个演员,您将仅通过发送消息与它交流。这同样适用于Client
与connection
/remote 通信时 - 它会代表您发送和接收消息,并将它们转发给您提供的listener
。 props
actor 伴生对象中的函数 class 通常用作构建 actor 的辅助函数。如果您的 actor 接受构造函数参数并且您必须注意不要关闭可变状态,则需要它。请记住,您不能使用new
运算符来创建演员,您必须调用Props
.- 一旦连接到远程,您的
Client
演员将收到类型为ByteString
的消息,如case data: ByteString =>
中。它会将数据写入 TCP 连接——有效地发送消息。每当它收到来自Received
类型的远程响应(如case Received(data) =>
中)时,它会将其转发给您的listener
演员。 - 参见 3。
Client
参与者从您的listener
和connection
接收消息并相应地转发它们。但是它不会检查它们来自哪里。因此,每当它收到ByteString
时,它就会将其发送到connection
/remote,而每当它收到Received
时,它就会将字节发送到listener
。如果您想进行双向通信,您需要确保您的听众可以收到这些消息。
这里总结一下双向通信的样子。
发送ByteString
到远程:
MyActor -> ByteString
-> 客户端 -> Write(ByteString)
-> connection/remote
从远程接收 ByteString
(服务器与客户端对话):
connection/remote -> Received(ByteString)
-> 客户端 -> ByteString
-> MyActor
其中“->”是消息发送。