0

2 つの TCP 接続を使用してベンダー API に接続しています。1 つの接続で、同期要求を行います。2 番目の接続は、API が応答をプッシュするために使用されます。

現在、ganymed-ssh-2ライブラリを使用して、サーバーとの 2 つの接続を確立しています。接続を確立するときにハンドシェイクを実行します。同期接続を確立すると、非同期チャネルでの認証に使用するトークンを受け取ります。現在、認証されたら、非同期チャネルで受信したすべてのメッセージを単純に出力しています。

同期チャネルでリクエストを作成し続け (現時点では単に標準入力を使用)、非同期チャネルからの応答を標準出力に出力し続けるには、どのような手順を実行する必要がありますか? アクターを使用する必要があるかどうか (入力ストリームから読み取り、それに応じてメッセージを解析できるアクターの例を見つけるのに苦労しました)、または使用すべき他の Scala 風の構造があるかどうかはわかりません。 .

class SyncConnection {
  def connect(): String = {
    // Establish connection    
    ...    
    val out = new PrintStream(outputStream)
    val in = new BufferedSource(inputStream).getLines()

    // Make login request, receive token
    out.println("loginRequest")
    out.flush()

    val token = in.next()

    token
  }
}

class AsyncConnection {
  def connect(token: String) {
    // Establish connection    
    ...    
    val in = new BufferedSource(inputStream).getLines()
    val out = new PrintStream(outputStream)

    // Authenticate using token
    out.println(token)
    out.flush()

    // Print all messages received on input stream
    for (line <- in) println(line)    
  }
}
4

1 に答える 1

0

私はこのタスクを達成するために、組み合わせまたは通常のScalaアクターとAkkaアクターを使用することになりました。アクターは、ハンドシェイクを実行するために互いにメッセージを簡単に渡すことができます。

  • 同期リクエスターアクターがログインリクエストを行います
  • 同期リスナーは、非同期接続を確立するために必要なトークンを受け取ります
  • 同期リスナーはトークンを非同期リクエスターに転送します
  • 非同期リクエスターが認証リクエストを行います
  • 非同期リスナーは、認証が成功したことの確認を受け取ります

2つの通常のアクターを2つの接続の入力ストリームに接続しました。

class InputStreamReaderActor(lines: Iterator[String], listener: ActorRef) extends Actor {
  def act() {
    for (line <- lines) {
      listener ! line
    }
  }
}

これにより、2つの接続で着信メッセージが読み取られ、応答がリスナーアクターにすぐに転送されます。これらのリスナーアクターは次のようになりました。

class SyncListenerActor() extends Actor {
  def receive: Receive = {
    // respond to incoming messages
  }
}

そして、接続を要求するために、各接続の出力ストリームをAkkaアクターにフックしました。

class SyncRequestorActor(out: PrintStream) extends Actor {
  def receive: Receive = {
    //    
  }

  def sendRequest(request: String) {
    println("Making request: " + request)
    out.println(request)
    out.flush()
  }
}
于 2012-07-16T15:02:18.110 に答える