本案例内容不做注释,不明白的参考:Akka中Actor消息发送与接收(案例一)
②Client与Server相互通信
服务端:
import akka.actor.{Actor, ActorSelection, ActorSystem, Props}
import com.typesafe.config.ConfigFactory
import scala.io.StdIn
class Server(host:String,port:Int) extends Actor{
var clientActorRef:ActorSelection= _
override def preStart(): Unit = {
clientActorRef = context.actorSelection(s"akka.tcp://client@${host}:${port}/user/client")
}
override def receive: Receive = {
case "start" => println("服务端已启动")
case msg:String => {
clientActorRef ! ServerMessage(msg)
}
case ClientMessage(msg) => {
println(s"服务端:$msg")
}
}
}
object Server extends App{
val host = "192.168.1.86"
val port = 9999
val clientHost = "192.168.1.86"
val clientPort = 7777
val conf = ConfigFactory.parseString(
s"""|akka.actor.provider="akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname=$host
|akka.remote.netty.tcp.port=$port
""".stripMargin
)
val serverSystem = ActorSystem("server",conf)
val actorRef = serverSystem.actorOf(Props(new Server(clientHost,clientPort)),"server")
actorRef ! "start"
while(true){
print("服务端:")
val str = StdIn.readLine()
actorRef ! str
}
}
启动服务端:
客户端:
import akka.actor.{Actor, ActorSelection, ActorSystem, Props}
import com.typesafe.config.ConfigFactory
import scala.io.StdIn
class Client(host:String,port:Int) extends Actor{
var serverActorRef:ActorSelection= _
override def preStart(): Unit = {
serverActorRef = context.actorSelection(s"akka.tcp://server@${host}:${port}/user/server")
}
override def receive: Receive = {
//接收服务端消息
case "start" => println("客户端已启动")
case msg:String => {
serverActorRef ! ClientMessage(msg)
}
case ServerMessage(msg) => {
println(s"收到服务端消息:$msg")
}
}
}
object Client extends App{
val host = "192.168.1.86"
val port = 7777
val serverHost = "192.168.1.86"
val serverPort = 9999
val conf = ConfigFactory.parseString(
s"""|akka.actor.provider="akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname=$host
|akka.remote.netty.tcp.port=$port
""".stripMargin
)
val clientSystem = ActorSystem("client",conf)
val actorRef = clientSystem.actorOf(Props(new Client(serverHost,serverPort)),"client")
actorRef ! "start"
while(true){
val str = StdIn.readLine()
actorRef ! str
}
}
启动客户端:
服务端与客户端通信: