模拟场景:有两台服务器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.rpc
import 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.rpc
import 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)
}
}
}