7

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 サーバーと通信することを期待しているのに、なぜアクター ref を与える必要があるのでしょうか?

  2. コンパニオン オブジェクトの props 関数は何のためのものですか?

  3. インスタンス化したら、このアクターを使用して TCP メッセージを送信するにはどうすればよいでしょうか? ByteString の形式で送信したいデータを含むメッセージを送信する必要がありますか?

4. 接続/違いは何ですか

case Received(data) => 
    listener ! data

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

1 に答える 1

8

質問への回答:

  1. コンストラクターは、 thisを使用してリモート サーバーと通信するアクターへの参照である をclass Client(remote: InetSocketAddress, listener: ActorRef) extends Actor受け取ります。リスナーは、これを介してメッセージを送受信します。はアクターであるため、メッセージを送信することによってのみ通信します。同じことが /remoteと通信する場合にも当てはまります。ユーザーに代わってメッセージを送受信し、指定した に転送します。listenerClientClientClientClientconnectionlistener
  2. propsアクター クラスのコンパニオン オブジェクトの関数は、通常、アクターを構築するためのヘルパー関数として使用されます。アクターがコンストラクター引数を受け取り、変更可能な状態を閉じないように注意する必要がある場合に必要です。newoperator を使用してアクターを作成できないことに注意してください。 を呼び出す必要がありますProps
  3. アクターは、リモートに接続されると、次のようなタイプのClientメッセージを受け取ります。そのデータを TCP 接続に書き込み、効果的にメッセージを送信します。タイプのリモートからの応答を受け取るたびに、それをアクターに転送します。ByteStringcase data: ByteString =>Receivedcase Received(data) =>listener
  4. 3 を参照してください。Clientアクターは、あなたlistenerとからメッセージを受信し、connectionそれに応じて転送します。ただし、それらがどこから来たのかはチェックしません。したがって、受信するたびに/remote にByteString送信し、受信するたびにバイトを に送信します。双方向通信が必要な場合は、リスナーがこれらのメッセージを受信できることを確認する必要があります。connectionReceivedlistener

ここで要約すると、双方向通信がどのように見えるかです。

ByteStringリモートに送信:

MyActor -> ByteString-> クライアント -> Write(ByteString)-> 接続/リモート

リモートから受信ByteString(サーバーがクライアントと通信):

接続/リモート -> Received(ByteString)-> クライアント -> ByteString-> MyActor

「->」はメッセージ送信です。

于 2015-11-17T03:15:40.183 に答える