使用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阶段,好多还没有掌握,可能代码写的并不是很理想,希望过段时间可以优化的更加实用一点。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值