初步尝试使用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()
}
}
}
输出结果:
服务端测试结果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CXwZlMkZnRHFme5YFZ2hWblZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zMwITOxgDMxIzNyQDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
客户端测试结果:
初步学习Scala阶段,好多还没有掌握,可能代码写的并不是很理想,希望过段时间可以优化的更加实用一点。
希望大家不吝赐教,一起进步。