您的位置:首页 > 其它

5.scala模式匹配及样例类的简单练习--RPC通信

2018-01-08 20:12 381 查看
需求:NodeManager作为客户端,ResourceManager作为服务端,客户端向服务端发送注册信息,服务端处理并返回给客户端成功注册的提示,客户端之后再保持心跳。大致过程如图:



代码部分:

样例类:Message.scala

package lesson10

//这里为了体现trait的作用,其实样例类底层已经实现了序列化
trait Message extends Serializable
//客户端向服务进行注册的消息
case class RegisterMessage(username:String,password:String) extends Message
//结果消息
case class ResultMessage(code:Int,content:String) extends  Message
//客户端向服务端发送心跳消息
case class HeartBeatMessage(id:String,content:String) extends  Message
客户端:MyNodeManager

package lesson10

import java.io.{ObjectInputStream, ObjectOutputStream}
import java.net.Socket

/**
* 客户端
*/
object MyNodeManager {

def main(args: Array[String]): Unit = {
val socket = new Socket("127.0.0.1",8888)
//发送注册消息 (case class   Object对象)
val oos = new ObjectOutputStream(socket.getOutputStream())
oos.writeObject(RegisterMessage("xiaoma","123"))
oos.flush()

val ois = new ObjectInputStream(socket.getInputStream)
val registerResultMessage = ois.readObject()
//打印注册消息
println(registerResultMessage)

registerResultMessage match {
case ResultMessage(id,content) =>{
oos.writeObject(HeartBeatMessage("hadoop1","alive"))
oos.flush()
}
}
val heartBeatMessage=ois.readObject()
//打印心跳
println(heartBeatMessage)

oos.close()

}

}


服务端:MyResourceManager

package lesson10

import java.io.{ObjectInputStream, ObjectOutputStream}
import java.net.ServerSocket

/**
* 服务端
*/
object MyResourceManager {
//处理客户端注册请求
def handlerRegister(username:String,password:String):ResultMessage={
// 如果这儿是spark,那么spark就会把注册过来的信息存到 内存里面
//内存易丢失,他还会把信息存到zookeeper里面
println("成功调用处理注册的方法")
ResultMessage(1,"success")
}

def hendlerHeartBeatMessage(hostname:String,status:String): ResultMessage={
println("成功调用处理心跳的方法")
ResultMessage(2,"success")
}

def main(args: Array[String]): Unit = {
//服务端
val serverSocket = new ServerSocket(8888)
val accept = serverSocket.accept()
val ois = new ObjectInputStream(accept.getInputStream)
val oos = new ObjectOutputStream(accept.getOutputStream)

while (true){
val clientMsg = ois.readObject()
val result = clientMsg match {
case RegisterMessage(username, password) => {
//做相对应的操作就可以了,并返回处理结果
handlerRegister(username, password)
}
case HeartBeatMessage(hostname,status) =>{
hendlerHeartBeatMessage(hostname,status)
}
}

oos.writeObject(result)
oos.flush()
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: