Scala distributed ping pong
This small scala example demonstrates the simplicity in which distributed programming is possible using the actor model. We setup an ECHOSERVER that simply responds with a PONG to any PING request it receives and we run this on an arbitrary server.
/* * EchoServer.scala */ package echoapp import scala.actors.Actor._ import scala.actors.remote.{Locator,Node,RemoteActor} import scala.actors.remote.RemoteActor.{alive,register} class Server(me : Locator) { RemoteActor.classLoader = getClass().getClassLoader() actor { alive(me.node.port) register(me.name, self) loop { react { case 'PING => reply("PONG") // equiv: sender ! "PONG" case msg => println(msg) } } } } object EchoServer { def main(args: Array[String]) { val me = new Locator(Node("127.0.0.1", 9010), 'echoServer) new Server(me) println("Echo server started") } }
For the sake of brevity the IP address of where the ECHOSERVER is running has been hardcoded. The client sends a PING message to the remote echo server and gathers the response(s).
/* * EchoClient.scala */ package echoapp import scala.actors.Actor._ import scala.actors.remote.{Locator,Node,RemoteActor} import scala.actors.remote.RemoteActor._ class Client(servloc : Locator) { RemoteActor.classLoader = getClass().getClassLoader() val server = select(servloc.node, servloc.name) actor { // The response is sent back to the thread that did the send. // If we move to this to main() then this is where the reponse will go // as we have no react/receive there it will be lost. server ! 'PING loop { react { case msg => println(msg) } } } } object EchoClient { def main(args: Array[String]) { val echoServer = Locator(Node("192.168.1.13", 9010), 'echoServer) new Client(echoServer) } }