用Scala模拟RPC通信

来源:互联网 发布:淘宝店铺客服电话 编辑:程序博客网 时间:2024/06/03 13:09

模拟场景:有两台服务器server和client,模拟server和client间的rpc通信。首先启动server, client上线后向server发送注册信息。如果注册成功,server返回注册成功的信息给client,client每隔3秒开始向server发送“心跳数据”;如果注册失败,server返回注册失败的信息给client。

代码实现:
1.创建样例类Regist、Registed、HeartBeat

package main.scala.rpc/**  * 样例类,用来服务端与客户端传递信息  *///注册信息case class Regist(hostname:String,password:String) //注册返回信息case class Registed(registed:Boolean)//心跳数据case class HeartBeat(information:String)

2.服务端

package main.scala.rpcimport java.io.{ObjectInputStream, ObjectOutputStream}import java.net.ServerSocket/**  * 服务端  */object Server{  def main(args: Array[String]): Unit = {    var server = new ServerSocket(9999)    //监听客户端请求    val socket = server.accept()    val in = new ObjectInputStream(socket.getInputStream)    val out = new ObjectOutputStream(socket.getOutputStream)    while(true){      val input = in.readObject()      //对客户端发来的信息进行模式匹配      input match{        case Regist("hadoop","hadoop")=>out.writeObject(Registed(true))//接收到正确注册信息,将注册成功的信息返回客户端        case x:HeartBeat=>println(x.information)//接收到心跳信息,将心跳信息打印到控制台        case _=>out.writeObject(Registed(false))//客户端注册失败,将失败信息返回客户端      }    }    server.close()  }}

3.客户端

package main.scala.rpcimport java.io.{ObjectInputStream, ObjectOutputStream}import java.net.Socket/**  * 客户端  */object Client {  def main(args: Array[String]): Unit = {    //创建socket    val socket = new Socket("127.0.0.1",9999)    val out = new ObjectOutputStream(socket.getOutputStream)    val in = new ObjectInputStream(socket.getInputStream)    //发送注册信息    out.writeObject(Regist("hadoop","hadoop"))    //接收服务端信息    val input = in.readObject()    //对接收到的信息进行模式匹配    input match{      case Registed(true)=>println("登录成功");send(out)      case Registed(false)=>println("登录失败")    }    socket.close()  }  /**    *发送心跳数据,每隔3秒发一次    */  def send(out: ObjectOutputStream): Unit ={    while(true) {      out.writeObject(HeartBeat("心跳数据"))      Thread.sleep(3000)    }  }}