首先两个主机(进程)间通信需要一个配置文件,这个配置文件主要是指定IP地址和端口号的,这个文件的内容是:
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
enabled-transports = ["akka.remote.netty.tcp"] //此处应该为List类型
netty.tcp {
hostname = "IP"
port = "Port"
}
}
}
服务端和客户端均要获得主机的IP和端口号后才能通信,这里可以将配置文件封装成一个trait(类似于Java中的接口),客户端和服务端都去调用它来获取自己的IP和端口
1.建立封装配置文件,提供调用
trait conf {
def getconf (hostname:String,Port:String)={
val list =new java.util.ArrayList[String]()
list.add("akka.remote.netty.tcp");
val conf = new java.util.HashMap[String,Object]();
conf.put("akka.actor.provider", "akka.remote.RemoteActorRefProvider");
conf.put("akka.remote.enabled-transports", list);
conf.put("akka.remote.netty.tcp.hostname",hostname);
conf.put("akka.remote.netty.tcp.port",Port);
conf
}
}
2.服务端:
import akka.actor.ActorSystem
import com.typesafe.config.ConfigFactory
import akka.actor.Props
import akka.actor.Actor
class Actor3 extends Actor {
override def receive ={
case msg:String => println(msg);
}
}
object RemoteTest extends conf{
def main(args: Array[String]): Unit = {
//构造环境,获取IP和端口,server类似“主机名”
val sys = ActorSystem("server",ConfigFactory.parseMap(getconf("127.0.0.1","2501")));
//注册Actor
sys.actorOf(Props[Actor3],"A3");//“A3即表明是为Actor3起的别名,因为该主机下可能会有多个Actor”
}
}
客户端:
import akka.actor.ActorSystem
import com.typesafe.config.ConfigFactory
import akka.actor.Props
object clientTest extends conf {
def main(args: Array[String]): Unit = {
//获取IP和端口,client类似“主机名”
val sys = ActorSystem("client",ConfigFactory.parseMap(getconf("127.0.0.1","2500")));
//调用远程Actor需要用actorSelection函数,指定是server主机,user下的A3
sys.actorSelection("akka.tcp://server@127.0.0.1:2501/user/A3") ! "I am client"
}
}
先运行服务端,将出现服务端侦听信息的窗口
[INFO] [04/01/2018 15:42:05.668] [main] [Remoting] Starting remoting
[INFO] [04/01/2018 15:42:06.216] [main] [Remoting] Remoting started; listening on addresses :[akka.tcp://server@127.0.0.1:2501]
[INFO] [04/01/2018 15:42:06.216] [main] [Remoting] Remoting now listens on addresses: [akka.tcp://server@127.0.0.1:2501]
再运行客户端,客户端也将出现侦听信息的窗口
[INFO] [04/01/2018 15:43:58.455] [main] [Remoting] Starting remoting
[INFO] [04/01/2018 15:43:59.003] [main] [Remoting] Remoting started; listening on addresses :[akka.tcp://client@127.0.0.1:2500]
[INFO] [04/01/2018 15:43:59.018] [main] [Remoting] Remoting now listens on addresses: [akka.tcp://client@127.0.0.1:2500]
由于客户端将发送信息给服务端,此时再看服务端窗口,将会看到服务端接收到了信息
[INFO] [04/01/2018 15:42:05.668] [main] [Remoting] Starting remoting
[INFO] [04/01/2018 15:42:06.216] [main] [Remoting] Remoting started; listening on addresses :[akka.tcp://server@127.0.0.1:2501]
[INFO] [04/01/2018 15:42:06.216] [main] [Remoting] Remoting now listens on addresses: [akka.tcp://server@127.0.0.1:2501]
I am client