DBZoo - Talent without discipline is like an Octopus on rollerskates.

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)
    }
}
blog/scala_distributed_ping_pong.txt · Last modified: 2009/11/27 17:54 (external edit)