|
Akka/Scala example source code file (IODocSpec.scala)
The IODocSpec.scala Akka example source code
/**
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package docs.io
//#imports
import akka.actor.{ Actor, ActorRef, Props }
import akka.io.{ IO, Tcp }
import akka.util.ByteString
import java.net.InetSocketAddress
//#imports
import akka.testkit.AkkaSpec
import scala.concurrent.duration._
class DemoActor extends Actor {
//#manager
import akka.io.{ IO, Tcp }
import context.system // implicitly used by IO(Tcp)
val manager = IO(Tcp)
//#manager
def receive = Actor.emptyBehavior
}
//#server
class Server extends Actor {
import Tcp._
import context.system
IO(Tcp) ! Bind(self, new InetSocketAddress("localhost", 0))
def receive = {
case b @ Bound(localAddress) =>
//#do-some-logging-or-setup
context.parent ! b
//#do-some-logging-or-setup
case CommandFailed(_: Bind) => context stop self
case c @ Connected(remote, local) =>
//#server
context.parent ! c
//#server
val handler = context.actorOf(Props[SimplisticHandler])
val connection = sender()
connection ! Register(handler)
}
}
//#server
//#simplistic-handler
class SimplisticHandler extends Actor {
import Tcp._
def receive = {
case Received(data) => sender() ! Write(data)
case PeerClosed => context stop self
}
}
//#simplistic-handler
//#client
object Client {
def props(remote: InetSocketAddress, replies: ActorRef) =
Props(classOf[Client], remote, replies)
}
class Client(remote: InetSocketAddress, listener: ActorRef) extends Actor {
import Tcp._
import context.system
IO(Tcp) ! Connect(remote)
def receive = {
case CommandFailed(_: Connect) =>
listener ! "connect failed"
context stop self
case c @ Connected(remote, local) =>
listener ! c
val connection = sender()
connection ! Register(self)
context become {
case data: ByteString =>
connection ! Write(data)
case CommandFailed(w: Write) =>
// O/S buffer was full
listener ! "write failed"
case Received(data) =>
listener ! data
case "close" =>
connection ! Close
case _: ConnectionClosed =>
listener ! "connection closed"
context stop self
}
}
}
//#client
class IODocSpec extends AkkaSpec {
class Parent extends Actor {
context.actorOf(Props[Server], "server")
def receive = {
case msg => testActor forward msg
}
}
"demonstrate connect" in {
val server = system.actorOf(Props(classOf[Parent], this), "parent")
val listen = expectMsgType[Tcp.Bound].localAddress
val client = system.actorOf(Client.props(listen, testActor), "client1")
watch(client)
val c1, c2 = expectMsgType[Tcp.Connected]
c1.localAddress should be(c2.remoteAddress)
c2.localAddress should be(c1.remoteAddress)
client ! ByteString("hello")
expectMsgType[ByteString].utf8String should be("hello")
client ! "close"
expectMsg("connection closed")
expectTerminated(client, 1.second)
}
}
Other Akka source code examplesHere is a short list of links related to this Akka IODocSpec.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.