使用Scala模擬簡單的RPC通訊,Socket程式設計
阿新 • • 發佈:2019-02-02
初步嘗試使用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階段,好多還沒有掌握,可能程式碼寫的並不是很理想,希望過段時間可以優化的更加實用一點。
希望大家不吝賜教,一起進步。