从Scala谈分布式代码实现原理
1.什么是 Socket?
Transmission Control Protocol/Internet protocol 即传输控制协议/网络协议
User Data Protocol 用户数据报协议 是与TCP相对应的协议,是TCP/IP协议族中的一种.
TCP/IP协议族包括运输层、网络层、链路层。
Socket的位置如下图
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
先从服务器端说起。服务器端先初始化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("计算完毕")
}
}