Akka中Actor消息发送与接收(案例二)

本案例内容不做注释,不明白的参考: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
  }
}

启动客户端:
这里写图片描述

服务端与客户端通信:
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值