多台客户端访问服务端简单实现
Service
import akka.actor.{Actor, ActorSystem, Props}
import com.typesafe.config.ConfigFactory
class Service extends Actor {
override def receive: Receive = {
case "start" => {
println("服务端启动成功!")
}
//case "你是谁?" => println("你是谁?")
case ClientToSerciceMsg(clientId,msg) => {
println(s"接收到${clientId}发来的信息")
msg match {
case x:String if(x.contains("你是")) => sender() ! ServiceMsg("我是你爸爸!")
case "你会说英语吗?" => sender() ! ServiceMsg("我不会")
case _ => sender() ! ServiceMsg("请重新说一遍!")
}
}
}
}
object Service {
var ACTORSYSTEM_AC_SERVICE = "ActorSystem_ac_Service"
var ACTORSYSTEM_AC = "ActorSystem_ac"
def main(args: Array[String]): Unit = {
val host = "127.0.0.1"
val post = "8888"
val str =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = ${host}
|akka.remote.netty.tcp.port = ${post}
""".stripMargin
// 创建配置工厂
val conf = ConfigFactory.parseString(str)
// 创建actorsystem
val ac = ActorSystem.create(ACTORSYSTEM_AC_SERVICE, conf)
val ref = ac.actorOf(Props(new Service()), ACTORSYSTEM_AC)
ref ! "start"
}
}
Client1
import java.util.UUID
import akka.actor.{Actor, ActorSelection, ActorSystem, Props}
import com.typesafe.config.ConfigFactory
import scala.io.StdIn
class Client1 extends Actor {
var selection: ActorSelection = null
override def preStart(): Unit = {
//和客戶端建立連接
var path = s"akka.tcp://${Service.ACTORSYSTEM_AC_SERVICE}@127.0.0.1:8888/user/${Service.ACTORSYSTEM_AC}"
selection = context.actorSelection(path)
//向客户端发送消息
//selection ! "你是谁?"
}
override def receive: Receive = {
case "start" => {
println("客户端启动成功!")
}
//客戶端輸入
case MsgC(msg :String) => {
selection ! ClientToSerciceMsg("client"+UUID.randomUUID().toString,msg)
}
case ServiceMsg(msg) =>{
println(s"${msg}")
}
}
}
object Client {
var ACTORSYSTEM_AC_CLIENT = "ActorSystem_ac_Client"
var ACTORSYSTEM_AC = "ActorSystem_ac"
def main(args: Array[String]): Unit = {
val host = args(0)
val post = args(1)
val str =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = ${host}
|akka.remote.netty.tcp.port = ${post}
""".stripMargin
// 创建配置工厂
val conf = ConfigFactory.parseString(str)
// 创建actorsystem
val ac = ActorSystem.create(ACTORSYSTEM_AC_CLIENT, conf)
val ref = ac.actorOf(Props(new Client()), ACTORSYSTEM_AC)
ref ! "start"
while(true){
//客戶端輸入
val in:String = StdIn.readLine()
ref ! MsgC(in)
}
}
}
Client2
import java.util.UUID
import akka.actor.{Actor, ActorSelection, ActorSystem, Props}
import com.typesafe.config.ConfigFactory
import scala.io.StdIn
class Client extends Actor {
var selection: ActorSelection = null
override def preStart(): Unit = {
//和客戶端建立連接
var path = s"akka.tcp://${Service.ACTORSYSTEM_AC_SERVICE}@127.0.0.1:8888/user/${Service.ACTORSYSTEM_AC}"
selection = context.actorSelection(path)
//向客户端发送消息
//selection ! "你是谁?"
}
override def receive: Receive = {
case "start" => {
println("客户端启动成功!")
}
//客戶端輸入
case MsgC(msg :String) => {
selection ! ClientToSerciceMsg("client"+UUID.randomUUID().toString,msg)
}
case ServiceMsg(msg) =>{
println(s"${msg}")
}
}
}
object Client2 {
var ACTORSYSTEM_AC_CLIENT = "ActorSystem_ac_Client2"
var ACTORSYSTEM_AC = "ActorSystem_ac"
def main(args: Array[String]): Unit = {
val host = args(0)
val post = args(1)
val str =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = ${host}
|akka.remote.netty.tcp.port = ${post}
""".stripMargin
// 创建配置工厂
val conf = ConfigFactory.parseString(str)
// 创建actorsystem
val ac = ActorSystem.create(ACTORSYSTEM_AC_CLIENT, conf)
val ref = ac.actorOf(Props(new Client()), ACTORSYSTEM_AC)
ref ! "start"
while(true){
//客戶端輸入
val in:String = StdIn.readLine()
ref ! MsgC(in)
}
}
}
封装类
object MsgC {
}
case class MsgC(val msg:String)
case class ClientToSerciceMsg(val clientId:String,val msg:String)
case class ServiceMsg(val msg:String)