Akka TCP 客戶端:如何使用 akka actor 通過 TCP 發送消息 (Akka TCP client: How can I send a message over TCP using akka actor)


問題描述

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 客戶端的簡單實現,但我不清楚如何使用這個客戶端.

  1. 構造函數接受一個 InetSocketAddress 和一個 ActorRef。InetSocketAddress 是有道理的(我假設這是目的地)但是 ActorRef 是什麼?這是我第一次使用akka,但據我了解,ActorRef 是另一個演員的參考。由於我的 TCP 客戶端是一個參與者,並且我希望這個 TCP 參與者與 TCP 服務器通信,不是和其他演員一起,我為什麼要給它一個演員參考?

  2. 伴生對像中的道具功能是什麼?

  3. < p>一旦實例化,我將如何使用這個 actor 發送 TCP 消息?我是否應該只向它發送一條帶有我想要以字節串形式發送的數據的消息?

4. 之間有什麼聯繫/區別

case Received(data) => 
    listener ! data

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

## 參考解法 #### 方法 1:

Answering your questions:

  1. The constructor class Client(remote: InetSocketAddress, listener: ActorRef) extends Actor takes a listener which is a reference to an actor that is using this Client to communicate with remote server. Listener will send and receive messages through this Client. Since Client is an actor you will communicate with it solely by sending messages. The same applies to the Client when it communicates with connection/remote ‑ it will send and receive messages on your behalf and forward them to the listener you provided.
  2. props function in a companion object of an actor class is usually used as a helper function for constructing an actor. It's needed if your actor takes constructor arguments and you have to take care not to close over mutable state. Remember you can't use new operator to create actors, you have to call Props.
  3. Your Client actor will receive messages of type ByteString as in case data: ByteString => once connected to the remote. It will write that data to the TCP connection ‑ effectively sending a message. Whenever it receives a response from remote of type Received as in case Received(data) => it will forward it to your listener actor.
  4. See 3. Client actor receives messages from your listener and from connection and forwards them accordingly. It does not check however where they came from. So whenever it receives ByteString it will send it to connection/remote, and whenever it receives Received it will send bytes to listener. You need to make sure your listener can receive these messages if you want to have 2 way communication.

To summarize here is how 2‑way communication looks like.

Send ByteString to remote:

MyActor ‑> ByteString ‑> Client ‑> Write(ByteString) ‑> connection/remote

Receive ByteString from remote (server talks to client):

connection/remote ‑> Received(ByteString) ‑> Client ‑> ByteString ‑> MyActor

where '‑>' is a message send.

(by poloyǝsʞǝla)

參考文件

  1. Akka TCP client: How can I send a message over TCP using akka actor (CC BY‑SA 2.5/3.0/4.0)

#akka-io #sockets #akka #TCP #scala






相關問題

Akka TCP 客戶端:如何使用 akka actor 通過 TCP 發送消息 (Akka TCP client: How can I send a message over TCP using akka actor)

Akka Stream, Tcp().bind, 客戶端關閉套接字時的處理 (Akka Stream, Tcp().bind, handle when the client close the socket)







留言討論