天天看点

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

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

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

代码如下:

客户端代码:

package com.rpc.client

import 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.server

import 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模拟简单的RPC通信,Socket编程

客户端测试结果:

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

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

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

继续阅读