从TCP传输谈到Scala分布式逻辑传输


从Scala谈分布式代码实现原理

1.什么是 Socket?

Transmission Control Protocol/Internet protocol 即传输控制协议/网络协议

User Data Protocol 用户数据报协议 是与TCP相对应的协议,是TCP/IP协议族中的一种.

scala的传输

TCP/IP协议族包括运输层、网络层、链路层。
Socket的位置如下图

img

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

img

 先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

​ Socket源于Unix,一切皆是文件,所以对于Scoket来说我们就简单的看作是一个云共享的文件,然后定义一下文件的名字(IP+端口号),把传输的数据放入文件,指定的目标IP下通过监听指定端口就可以打开监听

2.Scala的分布式传输简单实现

分布式必定是Master与Worker共同作用.Master需要指定代码传输给Worker进行执行

定义工作类Task

class Task extends Serializable {
  val data = 1 to 5
  val logic = (x:Int)=>x * 2
}

定义Master

object Master{
    def main(args:Array[String]:Unit={
        val worker = new Socket("localhost",9999)
        val objOut = new ObjectOutputStream(worker.getOutputStream)
        val task = new Task()
        objOut.writeObject(task)
        println("开始发送对象")
        objOut.flush()
        objOut.close()
        worker.close()//关闭工作窗口
    }   
}

定义worker

object Worker{
    def main(args:Array[String]):Unit={
        val server = new ServerSocket(9999)
        val master:Socket = server.accept()//阻塞线程.等待接收
        val objIn = new ObjectInputSteam(master.getInputStream)
        val task:Task = objIn.readObject().asInstanceOf[Task]
        objIn.close()
        master.close()
        server.clsoe()
        println("开始计算....")
        for(i<-task.data){
            println(task.logic(i))
        }
        println("计算完毕")
    }
}


文章作者: Jinxin Li
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jinxin Li !
  目录