使用Scala模擬簡單的RPC通訊,Socket程式設計

稻草一根發表於2017-04-27

初步嘗試使用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階段,好多還沒有掌握,可能程式碼寫的並不是很理想,希望過段時間可以優化的更加實用一點。

希望大家不吝賜教,一起進步。

相關文章