Scala分布式编程--主机(进程)间通信(一)

首先两个主机(进程)间通信需要一个配置文件,这个配置文件主要是指定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


 

转载于:https://my.oschina.net/u/3801367/blog/1788175

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值