使用Scala模拟简单的RPC通信,Socket编程

来源:互联网 发布:收购博客玩家数据 编辑:程序博客网 时间:2024/06/12 22:52

初步尝试使用Scala编程,还有很多不熟悉的地方,其实Scala的socket编程也是调用的java的api,所以基本上和java的代码大同小异。

实现功能大体如下:客户端发送一个序列化参数,里面以空格分割几个参数,在服务端进行接收,并分割字符串,获取到一个字符串数组,然后对其进行模式匹配,返回不同的处理结果,写入到输出流中,客户端获取到返回的结果并打印。

代码如下:

客户端代码:

package com.rpc.clientimport java.io.{DataInputStream, DataOutputStream, ObjectOutputStream}import java.net.{InetAddress, Socket}/**  * 模拟rpc通信的客户端  * Created by Administrator on 2017/4/27 0027.  *//*case class SubmitTask(id: String, name: String)case class HeartBeat(time: Long)case object CheckTimeOutTask*/object RpcClient {  //val arr = Array(CheckTimeOutTask, new HeartBeat(123), HeartBeat(88888), new HeartBeat(666), SubmitTask("0001", "task-0001"))  def main(args: Array[String]): Unit = {    //创建socket通信    val ia: InetAddress = InetAddress.getByName("localhost")    val socket: Socket = new Socket(ia,10001)    //建立输入输出流    val out: ObjectOutputStream = new ObjectOutputStream(new DataOutputStream(socket.getOutputStream))    val in: DataInputStream = new DataInputStream(socket.getInputStream)    //获取一个数组长度的一个随机数,选择一个随机的测试数据    //val a = "HeartBeat" + " " + "123"    //val a = "SubmitTask" + " " + "0001" + " " + "task-0001"    val a = "CheckTimeOutTask"    println("本次获取的是:"+ a)    //向服务端发送获取到的参数    //out.writeObject(a)    out.writeUTF(a)    //out.write(a)    out.flush()    //接受服务端的返回结果    val result: String = in.readUTF()    println("服务端返回结果:" + result)    in.close()    out.close()    socket.close()  }}
服务端代码:
package com.rpc.serverimport java.io.{DataInputStream, DataOutputStream, ObjectInputStream}import java.net.{ServerSocket, Socket}/**  * 模拟rpc通信的服务端程序  * Created by Administrator on 2017/4/27 0027.  *//*case class SubmitTask(id: String, name: String)case class HeartBeat(time: Long)case object CheckTimeOutTask*/object RpcServer {  //val arr = Array(CheckTimeOutTask, new HeartBeat(123), HeartBeat(88888), new HeartBeat(666), SubmitTask("0001", "task-0001"))  def main(args: Array[String]): Unit = {    //创建服务端    val listener: ServerSocket = new ServerSocket(10001)    println("服务端正在服务中.......")    while (true) {      //建立socket通信      val socket: Socket = listener.accept()      //创建输入输出流      val out = new DataOutputStream(socket.getOutputStream())      val in = new ObjectInputStream(new DataInputStream(socket.getInputStream()))      val read: String = in.readUTF()      println("客户端发送内容:" + read)      val ma: Array[String] = read.split(" ")      val result = ma match {        case Array("SubmitTask", id ,name) => {          s"$id, $name"        }        case Array("HeartBeat",time) => {          s"$time"        }        case Array("CheckTimeOutTask") => {          "check"        }        case _ => {          "error"        }      }      //将服务端的结果写回客户端      out.writeUTF(result.toString)      out.flush()      out.close()      in.close()      socket.close()    }  }}
输出结果:

服务端测试结果:

客户端测试结果:

初步学习Scala阶段,好多还没有掌握,可能代码写的并不是很理想,希望过段时间可以优化的更加实用一点。

希望大家不吝赐教,一起进步。

0 0
原创粉丝点击