Пример клиент-сервер с актерами Scala - PullRequest
7 голосов
/ 11 июня 2011

Каков наилучший способ реализации следующего примера?

  • Актер server получает Requests, обрабатывает их, создает новый Response для каждого Request иотправляет Response обратно Request отправителю.

  • Актер client отправляет Requests и получает Responses.

Вся эта связь асинхронна и, следовательно, она использует react.

Это всего лишь пример, и поэтому он не должен обрабатывать все такие случаи, как server не работает, client застрял и т.д.должно быть просто лаконичным и выразительным.

1 Ответ

8 голосов
/ 11 июня 2011
import scala.actors._
import Actor._

case class SendRequest(rid: String)
case class Request(rid: String)
case class Response(rid: String)

val server = actor {
   eventloop {
         case Request(rid) => 
            println("Server got request [%s] from client" format(rid))
        sender ! Response(rid)  
      }
   }   
}

val client = actor {
   eventloop {
         case SendRequest(rid) => server ! Request(rid)
         case Response(rid) => 
            println("Client got response [%s] from server" format(rid))
      }
   }
}

Использование:

scala> client ! SendRequest("Hello!")
Server got request [Hello!] from client
Client got response [Hello!] from server

Относительно:

Все это сообщение асинхронное и, следовательно, используется реакция.

Актеры, которые используют receive, также являются асинхронными.Они просто блокируют поток, ожидая новых сообщений.

...