分布式计算、云计算与大数据 第2版 课件全套 第1-11章 分布式计算概论 - 保险大数据分析案例_第1页
分布式计算、云计算与大数据 第2版 课件全套 第1-11章 分布式计算概论 - 保险大数据分析案例_第2页
分布式计算、云计算与大数据 第2版 课件全套 第1-11章 分布式计算概论 - 保险大数据分析案例_第3页
分布式计算、云计算与大数据 第2版 课件全套 第1-11章 分布式计算概论 - 保险大数据分析案例_第4页
分布式计算、云计算与大数据 第2版 课件全套 第1-11章 分布式计算概论 - 保险大数据分析案例_第5页
已阅读5页,还剩818页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章分布式计算概论提纲1.1 分布式计算概念1.2 分布式计算模式1.3 分布式基础问题与理论1.4 经典分布式(计算)系统分布式计算的定义分布式计算是一门计算机科学,主要研究对象是分布式系统。在介绍分布式计算概念前,首先简单了解一下什么是分布式系统。简单地说,一个分布式系统是由若干通过网络互联的计算机组成的软硬件系统[1],且这些计算机互相配合以完成一个共同的目标(往往这个共同的目标称为“项目”)分布式计算指在分布式系统上执行的计算。分布式计算是将一个大型计算任务分成很多部分分别交给其他的计算机处理,并将所有的计算结果合并为原问题的解决方案。这里与并行计算不同的是,并行计算是使用多个处理器并行执行单个计算。分布式计算的优缺点优点

高可伸缩性

资源共享

高性价比

容错性

超大规模

通用性弱点

多点故障一台或多台计算机的故障,或一条或多条网络链路的故障,都会导致分布式系统出现问题

安全性低分布式系统为非授权用户的攻击提供了更多机会

大规模资源调度的复杂性资源调度通常是一个NP-hard问题,大规模资源调度往往具有很高的复杂性和不确定性提纲1.1 分布式计算概念1.2 分布式计算模式1.3 分布式基础问题与理论1.4 经典分布式(计算)系统分布式云计算相关计算形式分布式云计算相关计算形式分布式云计算相关计算形式当前最热门计算机技术对比分布式云计算相关计算形式当前最热门计算机技术对比集中计算与分布式计算串行运算与并行运算并行运算与分布式计算的区别:分布式计算强调的是任务的分布执行,而并行计算强调的是任务的并发执行云计算概念提出提出者:Google工程师,比希利亚,27岁出发点:推广Google超级强大的计算资源,招贤纳士结果:蜂拥而至,名噪一时,被视为“云”的起源*-12-云计算分类私有云公有云混合云操作系统+应用服务引擎应用系统基础设施(IaaS)应用平台(PaaS)应用软件(SaaS)InfrastructureasaService以服务的形式提供虚拟硬件资源,如虚拟主机/存储/网络/数据库管理等资源。用于无需购买服务器、网络设备、存储设备,只需通过互联网租赁即可搭建自己的应用系统典型应用:AmazonWeb

Service(AWS)PlatformasaService提供应用服务引擎,如互联网应用编程接口/运行平台等。用户基于该应用服务引擎,可以构建该类应用。典型应用:GoogleAppEngine,F,MicrosoftAzure服务平台SoftwareasaService用户通过Internet(如浏览器)来使用软件。用户不必购买软件,只需按需租用软件典型应用:GoogleDoc,S,OracleCRMOnDemand,OfficeLiveWorkspace面向外部用户需求,通过开放网络提供云计算服务IDC,GoogleApp,Saleforce在线CRM按提供的服务类型按云服务的对象大型企业按照云计算的架构搭建平台,面向企业内部需求提供云计算服务企业内部数据中心等兼顾以上两种情况的云计算服务AmazonWebServer等既为企业内部又为外部用户提供云计算服务云计算与网格计算网格计算:利用互联网把地理上广泛分布的各种资源(计算、存储、带宽、软件、数据、信息、知识等)连成一个逻辑整体,就像一台超级计算机一样,为用户提供一体化信息和应用服务(计算、存储、访问等)。网格计算强调资源共享,任何节点都可以请求使用其它节点的资源,任何节点都需要贡献一定资源给其他节点。云计算强调专有,请求或获取的资源是专有的,并且由少数团体提供,使用者不需要贡献自己的资源。网格计算侧重并行的计算集中性需求,并且难以自动扩展。云计算侧重事务性应用,大量的单独的请求,可以实现自动或半自动的扩展。云计算包含的网格计算特征:(1)提供在线的计算、存储等服务(2)超大规模的资源组合(3)资源的虚拟化*14云计算与分布式计算分布式计算(狭义):将待解决问题分成多个小问题,再分配给许多计算系统处理,最后将处理结果加以综合。特点:把计算任务分派给网络中的多台独立的机器优点稀有资源可以共享通过分布式计算可以在多台计算机上平衡计算负载可以把程序放在最适合运行它的计算机上流行的分布式项目SETI@Home:寻找外星文明RC-72:密码分析破解,研究和寻找最为安全的密码系统Folding@home:研究蛋白质折叠、聚合问题UnitedDevices:寻找对抗癌症的有效的药物GIMPS:寻找最大的梅森素数(解决较为复杂的数学问题)云计算包含的分布式计算特征:1)通过资源调度和组合满足用户的资源请求;2)对外提供统一的、单一的接口云计算是分布式计算的发展,是分布式计算的一种新形式。分布式邮箱系统15云计算与并行计算并行计算:是相对于串行计算的概念,最早出现于上个世纪六七十年代,指在并行计算机上所做的计算。现通常指同时使用多种计算资源解决计算问题的过程,即一个程序的多个部分同时运行于多个处理器上。分类:可分为时间上的并行(流水线)和空间上的并行(多处理器并发)并行计算问题的特征将工作分离成离散部分,有助于同时解决随时并及时地执行多个程序指令(多条线同时运行)多计算资源下解决问题的耗时要少于单个计算资源下的耗时云计算包含的并行计算特征:用户资源(单一类型和组合类型)请求的同时处理*16云计算与对等计算对等计算系统中,每个节点都拥有对等的功能与责任,既可以充当服务器向其他节点提供数据或服务,又可以作为客户机享用其他节点提的供数据或服务,节点之间的交互可以是直接对等的,任何节点可以随时自由地加入或离开系统。对等计算:有可能作为云计算的一个类型预测:将可能以“对等子云”的形式出现在云计算中。依据:云计算对超大规模、多类型资源的统一管理是困难的;对等计算具有鲁棒性、可扩展性、成本、搜索等方面的优点Google的云计算服务曾出现严重问题,Gmail、Blogger和Spreadsheet等服务均长时间当机。亚马逊S3云计算服务也曾出现问题。而P2P系统则有更强的抗毁能力。*17雾计算基本概念雾计算是个很形象的名称,提出它的GinnyNichols提了一个有趣的说法“雾是接近地面的云”。这句话有两层含义:1)雾计算和云计算有很多相似。例如:它们都基于虚拟化技术,从共享的资源池中为多用户提供资源。2)“接近地面”。这也指出了雾和云的一个不同——网络拓扑中的位置。雾的概念:雾节点所使用的设备:

雾主要使用边缘网络中的设备。这些设备可以是传统网络设备(早已部署在网络中的路由器,交换机,网关等等),也可以是专门部署的本地服务器。雾计算基本原理雾计算概念示意图雾计算实例智能交通灯系统雾计算的引入将为智能交通灯系统带来更多的可能性。如:监控过程中,相邻帧间画面只有部分变化,非常适于在雾节点处缓存若干帧画面,压缩后再传向中心机房,这样从雾节点到机房的网络带宽将得到很大缓解。在雾节点处,可判断监控画面中是否有救护车头灯闪烁,做出实时决策发送给对应交通灯,协助救护车通过。

边缘计算基本概念边缘计算(EdgeComputing)指的是接近于事物,数据和行动源头处的计算也被称为:邻近计算或者接近计算(ProximityComputing)边缘计算的概念:边缘网络:

边缘计算让数据在边缘网络处处理。边缘网络基本上由终端设备(例如移动手机、智能物品等等)、边缘设备(例如边界路由器、机顶盒、网桥、基站、无线接入点等等)、边缘服务器等构成。边缘计算基本原理云计算、雾计算、边缘计算关系:雾计算也可以进行边缘计算。除了边缘网络,雾计算也可以拓展到核心网络。边缘和核心网络(例如核心路由器、区域服务器、广域网路开关等等)的组件都可以作为雾计算基础设施。边缘计算依赖于不构成网络的单独节点,需要通过云实现孤岛中节点的对等流量传输。雾计算用几个层次形成网络,节点之间具有广泛的对等互连能力。雾计算以及边缘计算都不是用来代替云计算,它们共同形成一个彼此受益的计算模型。边缘计算实例智能交通灯系统无人驾驶汽车走向规模化应用必须存储和运算海量的数据。无人驾驶汽车要在高速行驶过程中,通过无线网络与云端进行大量超低时延、超大流量的数据交互,现有网络根本没有能力支撑。依靠移动边缘计算,数据可以就近存储于车辆附近位置甚至车身上。在车辆高速度运动过程中,位置信息变化十分迅速,被置于车身上的最末端的移动边缘计算服务器能够精确地实时感知车辆位置的变动,并将分析所得结果以极低延迟(通常是毫秒级)传送给临近区域内其他联网车辆,以便车辆做出决策。

移动边缘计算移动边缘计算就是利用无线接入网络就近提供电信用户IT所需服务和云端计算功能,而创造出一个具备高性能、低延迟与高带宽的电信级服务环境,加速网络中各项内容、服务及应用的快速下载,让消费者享有不间断的高质量网络体验。移动边缘计算把无线网络和互联网两者技术有效融合在一起。移动云计算移动云计算是指通过移动网络以按需、易扩展的方式获得所需的基础设施、平台、软件(或应用)等的一种IT资源或(信息)服务的交付与使用模式。如图所示,移动云计算是云计算技术在移动互联网中的应用,本质上就是基于移动终端获取各种云端服务的技术。大数据计算概念随着互联网与计算机系统需要处理的数量越来越大,大数据计算成为一种非常重要的数据分析处理模式。大数据计算一般是指利用分布式计算技术对海量数据进行在线或离线的实时性或批处理分析计算。当前大数据计算的主要模式有:基于MapReduce的批处理计算、流式计算、基于Spark的内存计算。基于MapReduce的批处理计算InputsplitshuffleoutputMapReduce计算模式的主要思想是将自动分割要执行的问题(例如程序)拆解成Map和Reduce两个函数操作,然后对分块的大数据采用“分而治之”的并行处理方式分析计算数据。大数据流式计算大数据批处理计算关注数据处理的吞吐量,而大数据流式计算更关注数据处理的实时性。流式计算具有很强的实时性,需要对应用源源不断产生的数据实时进行处理,使数据不积压、不丢失,常用于处理电信、电力等行业应用以及互联网行业的访问日志等。基于Spark的内存计算由于MapReduce计算过程中需要读写HDFS存储(访问磁盘IO),而在Spark内存计算过程中,使用内存替代了使用HDFS存储中间结果,即在进行大数据分析处理时使用分布式内存计算,内存访问要比磁盘快得多。因此,基于Spark的内存计算的数据处理性能会提升很多,特别是针对需要多次迭代大数据计算的应用。无服务器计算无服务器计算来自英文ServerlessComputing的翻译,简称为Serverless,它并不是指没有服务器,而是说,对于用户,服务器变得“不可见”了(或者说“无感知”),是指开发者不需要直接管理服务器资源。Serverless是一种云计算模型,它允许开发者编写和部署功能单元(函数)而无需关心底层的服务器基础设施。在Serverless架构中,云服务提供商负责动态管理和分配服务器资源,根据实际需要为函数执行提供计算资源。Serverless的核心目的,就是在云计算的基础上,再向前迈进一步,彻底“包揽”所有的环境工作,直接提供计算服务。在Serverless架构下,开发者只需编写代码并上传,云平台就会自动准备好相应的计算资源,完成运算并输出结果,从而大幅简化开发运维过程。也就说,Serverless是云计算的进一步延伸,所以,它继承了云计算的最大特点——按需弹性伸缩、按需付费。无服务器计算从层级上来看,Serverless在传统云计算SaaS的Application(应用)层级之上,又加了一层——function(函数),如图所示。它的颗粒度更细,可以更灵活地满足用户的算力需求。按照CNCF对Serverless的定义,Serverless架构是采用FaaS(函数即服务)和BaaS(后端服务)服务来解决问题的一种设计。即Serverless=FaaS+BaaS。FaaS就是Functionasaservice(函数即服务)。每一个函数都是一个服务,函数可以由任何语言编写,直接托管在云平台,以服务形式运行,通过事件触发。提纲1.1 分布式计算概念1.2 分布式计算模式1.3 分布式基础问题与理论1.4 经典分布式(计算)系统2000年7月,来自加州大学伯克利分校EricBrewer教授首次提出了著名的CAP猜想。2年后,来自麻省理工学院的SethGilbert和NancyLynch从理论上证明了Brewer教授CAP猜想。从此,CAP理论正式在学术上成为了分布式计算领域的公认定理,并深深地影响了分布式计算的发展。分布式系统的CAP理论:对于一个分布式计算系统来说,不可能同时满足以下三点:一致性(C)、可用性(A)、分区容忍性(P)。一致性(C):即Consistency,所有节点访问同一份最新的数据副本。在分布式系统中的所有数据备份,在同一时刻是否同样的值。可用性(A):即Availability,对数据更新具备高可用性。在集群中一部分节点故障后,集群整体还能响应客户端的读写请求。。分区容错性(P):即Partitiontolerance,当分布式系统集群中的某些结点无法联系时仍能正常提供服务。*33分布式系统的CAP定理CAP理论一个说明CAP理论的分布式应用例子1)正常情况:服务器N1和N2分别写、读数据,且服务器N1和N2通过同步消息来实现数据读写的一致性。2)当服务器N1和N2之间的通信异常中断时:则系统(服务器N2)要么只能读取旧数据,牺牲一致性;要么服务器N1的写操作就会随着数据更新消息发送失败而回滚,系统无法使用,违背了可用性。提纲1.1 分布式计算概念1.2 分布式计算模式1.3 分布式基础问题与理论1.4 经典分布式(计算)系统分布式系统介绍分布式系统:指通过网络互连,可协作执行某个任务的独立计算机集合。分布式系统介绍WWW(WorldWideWeb)是全球最大的分布式系统,互联网服务之一统一资源标识符(URI)资源定位器(URL)超文本传输协议(HTML)客户机/服务器(Client/Server)模式分布式系统介绍SETI@home(寻找外星人)搜寻证实地球外智能生物存在的证据志愿参加人数最多的分布式项目(Project)屏幕保护模式下的后台运行(客户端计算为主)1999-2005543万用户、243万年累计计算没有发现外星文明直接证据分布式系统介绍BOINC项目(BerkeleyOpenInfrastructureforNetworkComputing)传统客户端/服务器架构服务器端配置:数据库服务器、数据处理服务器、资源任务调配服务器、Web服务器等子系统组成客户端设置志愿计算功能服务器(软件)用于:数学、物理、化学、生物科学、地理科学等项目计算最为流行的分布式计算平台分布式系统介绍分布式系统介绍OpenStackOpenStack是一个开源的云计算管理平台项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台由一系列具有RESTful接口的Web服务所实现的,是一系列组件服务集合OpenStack本身是一个分布式系统,不但各个服务可以分布部署,服务中的组件也可以分布部署OpenStack包含了许多组件服务Nova:提供计算服务;Keystone:提供认证服务;Glance:提供镜像服务;Neutron:提供网络服务;Horizon:提供仪表盘服务;Swift:提供对象存储服务;Cinder:提供块存储服务;Heat:提供编排服务;Ceilometer:提供计费和监控服务;Trove:提供数据库服务;Sahara:提供数据处理服务分布式系统介绍OpenStackOpenStack的总体架构分布式系统介绍HadoopHadoop是一个由Apache基金会所开发的分布式系统基础架构。起源于开源网络搜索引擎ApacheNutch,基于谷歌分布式文件系统“GFS”和分布式数据处理系统“MapReduce”两篇论文实现的开源版本包括核心的分布式文件存储系统HDFS和分布式计算框架MapReduce,以及用于集群资源管理的YARN分布式系统介绍HadoopHDFS集群按照管理节点-工作节点模式运行,其中NameNode为管理节点,DataNode为工作节点,SecondaryNameNode是辅助namenode分布式系统介绍HadoopHBase是一个在HDFS上开发的面向列的分布式数据库,服务依赖于Zookeeper,用一个Master节点协调管理一个或多个Regionserver从属机分布式系统介绍HadoopYARN是Hadoop的集群资源管理系统,ResourceManager是一个全局的资源管理器ApplicationMaster是应用程序级别的管理器NodeManager是YARN中每个节点上的代理管理器分布式系统介绍Spark一种基于内存的快速、通用、可扩展的大数据分析计算引擎,相对于MapReduce的批处理计算,Spark可以带来上百倍的性能提升其核心是建立在统一的抽象弹性分布式数据集(ResilienntDistributedDatasets,RDD)之上的,RDD允许开发人员在大型集群上执行基于内存的计算,同时屏蔽了Spark底层对数据的复杂抽象和处理Spark软件栈包含四大组件:SparkSQL:SparkSQL是Spark中用于处理结构化数据的组件;SparkStreaming:SparkStreaming是Spark提供用于处理实时的流数据的组件;MLlib:MLlib是Spark中集成了常见的机器学习模型的组件GraphX:GraphX是Spark提供图计算和并行图计算功能的组件。分布式系统介绍Spark作为一个开源集群运算框架,Spark共支持四种集群运行模式:Standalone模式,基于ApahceMesos,基于HadoopYARN以及基于Kubernetes。ClusterManager:控制整个集群,监控worker;Worker节点:从节点,负责控制计算节点,启动Executor或者Driver;Driver:运行Application;Executor:执行器。Spark运行架构图如下。分布式系统介绍KubernetesGoogle开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。Kubernetes将集群中的机器划分为一个Master节点和一群工作节点(Node)。其中Master组件提供集群的管理控制中心;Node组件提供Kubernetes运行时环境,以及维护Pod。分布式系统介绍其他分布式计算项目C(模拟全球气象变化)Quake-CatcherNetwork(强力地震观测预测网)WorldCommunityGrid(查询人类疾病的治疗方法)Einstein@Home(寻找脉冲星的引力波)FightAIDS@home(研究艾滋病生理原理和相关药物)Folding@home(了解蛋白质折叠)GIMPS(寻找新的梅森素数)D(破解密锁)…2025/3/21DistributedComputing52Questions1)并行计算与分布式计算区别?2)分布式计算的核心技术是?3)什么是BONIC架构?如何应用在分布式计算应用中?4)有哪些分布式计算模式?举例说明相关实际应用?5)分布式计算的核心技术是?第2章分布式编程基础提纲进程间通信Socket编程RMI编程P2P编程进程间通信的定义分布式计算的核心技术是进程间通信(interprocesscommunication,IPC),即在互相独立的进程(进程是程序的运行时表示)间通信及共同协作以完成某项任务的能力。计算机1计算机2互联网单播通信与组播通信在分布式计算中,两个或多个进程按约定的某种协议进行IPC,此处协议是指数据通信各参与进程必须遵守的一组规则。在协议中,一个进程有些时候可能是发送者,在其他时候则可能是接收者。单播组播IPC设施系统级IPC设施消息队列共享内存。。。高层的IPCAPI抽象开发分布式应用往往工作量比较大且复杂更好地把注意力集中在应用逻辑上API:ApplicationProgrammingInterface,应用编程接口或应用程序接口IPCAPI的四种基本操作发送(Send):该操作由发送进程发起,旨在向接收进程传输数据。操作必须允许发送进程识别接收进程和定义待传数据。接收(Receive):该操作由接收进程发起,旨在接收发送进程发来的数据操作必须允许接收进程识别发送进程和定义保存数据的内存空间,该内存随后被接收者访问。连接(Connect):对面向连接的IPC,必须有允许在发起进程和指定进程间建立逻辑连击的操作:其中以进程发出请求连接操作而另一进程发出接受连接操作。断开连接(Disconnect):对面向连接的IPC,该操作允许通信的双方关闭先前建立起来的某一逻辑连接。IPC使用示例:HTTP事件同步IPC中的一个主要难点是进行IPC的各相关进程是独立执行的,各进程不知道对方进程的情况。协议涉及的双方必须按特定顺序发起IPC操作,否则可能通信失败。因此,参与通信的两个进程需要同步他们的操作,由一方发送数据,另一方则需要等待所有数据发送完成时,开始接收数据。IPC设施提供事件同步的最简单的方法是使用阻塞(blocking)机制或同步(synchronous),即挂起某一进程的执行,直到该进程发起的某个操作执行结束。另外,IPC操作可以是异步(asynchronous)或非阻塞操作(nonblocking)。进程发起的异步操作不会引起阻塞。因此,一旦向IPC设施发出异步操作后,进程可以继续执行。当该异步操作完成后,进程才会随后得到IPC设施的通知。IPC范型在最低抽象层,IPC利用底层的串行或并行数据传输机制,在连接上传输二进制流。例如,这种IPC范型可以用于编写网络驱动软件。这种形式的IPC属于网络或操作系统编程领域。下一个抽象层是众所周知的一种范型,称作socket应用程序接口(socketAPI)。在socket范型中,两个进程使用名为socket的逻辑构造交换数据,每一方都要建立一个socket。待发送数据被写入socket。在另一端,接收进程从自身的socket中读取或提取数据。远程过程调用(remoteprocedurecall)或远程方法调用(remotemethodinvocation)范型通过允许向远程进程发送过程调用或方法调用,来提供更高层次的抽象。这是,数据作为参数和返回值,在两个进程间进行传递。提纲进程间通信Socket编程RMI编程P2P编程Socket历史SocketAPI最早作为BerkeleyUnix操作系统的程序库,出现于20世纪80年代早期,用于提供IPC功能。现在所有主流操作系统都支持SocketAPI。在BSD、Linux等基于Unix的系统中,SocketAPI都是操作系统的一部分。在个人计算机操作系统如MS-DOS、WindowsNT、Mac-OS、OS\2中,SocketAPI都是以程序库形式提供的(在Windows系统中,SocketAPI称为Winsocket)。Java语言在设计之初就考虑到了网络编程,也将SocketAPI作为语言核心类的一部分提供给用户。所有这些API都使用相同的消息传递模型和非常类似的语法。Socket现状SocketAPI是实现进程间通信的第一种编程设施。SocketAPI非常重要的原因主要有以下两点:1)SocketAPI已经成为IPC编程事实上的标准,高层IPC设施都是构建于SocketAPI之上的,即它们基于SocketAPI实现的。2)对于响应时间要求较高或在有限资源平台上运行的应用来说,用SocketAPI实现是最合适的。基本Socket机制两种主要的传输层协议UDP(UserDatagramProtocol,用户数据包协议):允许使用无连接通信传输报文(即在传输层发送和接受)。被传输报文称为数据报(datagram)。根据无连接通信协议,每个传输的数据包都被分别解析和路由,并且可按任何顺序到达接收者。TCP(TransmissionControlProtocol,传输控制协议):面向连接的协议,它通过在接受者和发送者之间建立的逻辑连接来传输数据流。由于有连接,从发送者到接受者的数据能保证以与发送次序相同的顺序被接受。两种主要的传输层协议UDP:如果主机A上的进程1通过顺序传输数据包m1、m2,向主机B上的进程2发送消息,这些数据包可以通过不同路由在网络上传输,并且可按下列任何一种顺序到达接收进程:m1-m2或m2-m1。在数据通信网络的术语中,“包”(或称分组,英文为packet)是指在网络上传输的数据单位。每个包中都包含有效数据(载荷,payload)以及一些控制信息(头部信息),如目的地址。TCP:如果主机A上的进程1顺序传输m1、m2,向主机B上的进程2发送消息,接收进程可以认为消息将以m1-m2顺序到达,而不是m2-m1。两种类型的Socket根据传输层所使用协议不同,SocketAPI分成两种类型:数据包Socket:即DatagramSocket,一种使用UDP传输的Socket。流式Socket:即StreamSocket,使用TCP传输的Socket。提示:由于分布式计算与网络应用主要使用流式Socket比较多,后面将重点讨论流式Socket的开发技术。两种类型的SocketAPI数据报Socket(DatagramSocket)流式Socket(StreamSocket)流式SocketAPIJava流式Socket

API在Java中,有两个类提供了流式SocketAPI:1)ServerSocket用于接受连接,我们将称之为连接socket2)Socket用于数据交换,我们将称之为数据socket流式Socket程序流类ServerSocket的主要方法和构造函数Method/constructorDescriptionServerSocket(int

port)Createsaserversocketonaspecifiedport.Socketaccept()throwsIOExceptionListensforaconnectiontobemadetothissocketandacceptsit.Themethodblocksuntilaconnectionismade.publicvoidclose()throwsIOException

Closesthissocket.voidsetSoTimeout(int

timeout)throwsSocketExceptionSetatimeoutperiod(inmilliseconds)sothatacalltoaccept()forthissocketwillblockforonlythisamountoftime.Ifthetimeoutexpires,ajava.io.InterruptedIOExceptionisraised类Socket的主要方法和构造函数Method/constructorDescriptionSocket(InetAddress

address,int

port)CreatesastreamsocketandconnectsittothespecifiedportnumberatthespecifiedIPaddressvoidclose()throwsIOExceptionClosesthissocket.InputStreamgetInputStream()throwsIOExceptionReturnsaninputstreamsothatdatamaybereadfromthissocket.OutputStream

getOutputStream()throwsIOExceptionReturnsanoutputstreamsothatdatamaybewrittentothissocket.voidsetSoTimeout(int

timeout)throwsSocketExceptionSetatimeoutperiodforblockingsothataread()callontheInputStreamassociatedwiththisSocketwillblockforonlythisamountoftime.Ifthetimeoutexpires,ajava.io.InterruptedIOExceptionisraised流式Socket基本语法//instantiatesasocketforacceptingconnectionServerSocketconnectionSocket=newServerSocket(portNo);SocketdataSocket=connectionSocket.accept();//getaoutputstreamforwritingtothedatasocketOutputStreamoutStream=dataSocket.getOutputStream();PrintWritersocketOutput=newPrintWriter(newOutputStreamWriter(outStream));socketOutput.println(message);socketOutput.flush();dataSocket.close();connectionSocket.close();//instantiatesadatasocketandconnectwithatimeoutSocketAddress

sockAddr=newInetSocketAddress(acceptorHost,acceptorPort);SocketmySocket=newSocket();inttimeoutPeriod=2000;//2secondsmySocket.connect(sockAddr,timeoutPeriod);//getaninputstreamforreadingfromthedatasocketInputStreaminStream=mySocket.getInputStream();BufferedReader

socketInput=newBufferedReader(newInputStreamReader(inStream));Stringmessage=socketInput.readLine();mySocket.close();类Example1ConnectionAcceptor类Example1ConnectionRequestor流式Socket基本语法在本例中有一些值得关注的地方:1)由于这里处理的是数据流,因此可使用Java类PrinterWriter向socket写数据和使用BufferedReader从流中读取数据。这些类中所使用的方法与向屏幕写入一行或从键盘读取一行文本相同。2)尽管本例将Acceptor和Requestor分别作为数据发送者和数据接收者介绍,但两者的角色可以很容易地进行互换。在那种情况下,Requestor将使用getOutputStream向socket中写数据,而Acceptor将使用getInputStream从socket中读取数据。3)事实上,任一进城都可以通过调用getInputStream和getOutputStream从流中读取数据或向其中写入数据。4)在本例中,每次只读写一行数据(分别使用readLine和println方法),但其实也可以每次只读写一行中的一部分数据(分别使用read和print方法来实现)。然而,对于以文本形式交换消息的文本协议来说,每次读写一行是标准做法。事件状态图隐藏数据Socket细节publicclassExample2ConnectionAcceptor{publicstaticvoidmain(String[]args){…

ServerSocketconnectionSocket=newServerSocket(portNo);MyStreamSocketdataSocket=newMyStreamSocket(connectionSocket.accept());dataSocket.sendMessage(message);dataSocket.close();connectionSocket.close();…}//endmain}//endclass类Example2ConnectionAcceptor类Example2ConnectionRequestorpublicclassExample2ConnectionRequestor{publicstaticvoidmain(String[]args){…

MyStreamSocket

mySocket=newMyStreamSocket(acceptorHost,acceptorPort);Stringmessage=mySocket.receiveMessage();

mySocket.close();…}//endmain}//endclassMyStreamSocket类实现细节publicclassMyStreamSocketextendsSocket{privateSocketsocket;privateBufferedReaderinput;privatePrintWriteroutput;

MyStreamSocket(InetAddress

acceptorHost,intacceptorPort)throwsSocketException,IOException{socket=newSocket(acceptorHost,acceptorPort);

setStreams();}

MyStreamSocket(Socketsocket)throwsIOException{

this.socket=socket;

setStreams();}privatevoidsetStreams()throwsIOException{//getaninputstreamforreadingfromthedatasocket

InputStream

inStream=socket.getInputStream();input=newBufferedReader(newInputStreamReader(inStream));

OutputStream

outStream=socket.getOutputStream();output=newPrintWriter(newOutputStreamWriter(outStream));//createaobjectforcharacter-modeoutput}publicvoidsendMessage(Stringmessage)throwsIOException{

output.println(message);

output.flush();}//endsendMessagepublicStringreceiveMessage()throwsIOException{//readalinefromthedatastreamStringmessage=input.readLine();returnmessage;}//endreceiveMessage}//endclass提纲进程间通信Socket编程RMI编程P2P编程RMI的定义RMI是RemoteMethodInvocation的缩写,即远程方法调用。RMI是RPC模型的面向对象实现,是一种用于实现远程过程调用的应用程序编程接口,它使客户机上运行的程序可以调用远程服务器上的对象。JavaRMI由于RMIAPI只适用于Java程序,所以,我们一般称为JavaRMI。但该API相对简单,因此,非常适合于用作学习网络应用中分布式对象技术的入门资料。

JavaRMI使用接口化编程。在需要服务端的某一个远程对象时,编程人员通过定义一个该对象的接口来隐藏它的实现,并在客户端定义一个相同的接口,客户端使用该接口可以像本地调用一样实现远程方法调用。通过调用RMI的API,对象服务器通过目录服务导出和注册远程对象,这些对象提供一些可以被客户程序调用的远程方法。从语法上来看,RMI通过远程接口声明远程对象,该接口是Java接口的扩展;远程接口由对象服务器实现;对象客户使用与本地方法调用类似的语法访问远程对象,并调用远程对象的方法。JavaRMI体系结构从应用层看,RMI由客户应用、服务器应用和对象目录服务3个部分。RMI系统实现架构由三层组成:桩/框架(Stub/Skeleton)层:客户端的桩和服务器端的框架;远程引用(remotereference)层:处理远程引用行为;传输层(transport):连接的建立和管理,以及远程对象的跟踪。RMI基本分布式应用远程接口定义服务器端软件客户端软件RMI基本分布式应用:远程接口定义在RMIAPI中,分布式对象的创建开始于远程接口。Java接口是为其他类提供模板的一种类:它包括方法声明或签名,其实现由实现该接口的类提供。Java远程接口是继承Java类remote的一个接口,该类允许使用RMI语法实现接口。与必须为每个方法签名定义扩展和RemoteException不同,远程接口语法与常规或本地Java接口相同。RMI基本分布式应用:远程接口定义importjava.rmi.*;publicinterfaceSomeInterface

extendsRemote{//signatureoffirstremotemethodpublicStringsomeMethod1()throwsjava.rmi.RemoteException;//signatureofsecondremotemethodpublicintsomeMethod2(intx)throwsjava.rmi.RemoteException;//signatureofotherremotemethodsmayfollow}//endinterfaceRMI基本分布式应用:服务器端软件对象服务器是指这样的一种对象,它可以提供某一分布式对象的方法和接口。每个对象服务器必须:1)实现接口部分定义的每个远程方法;2)向目录服务注册包含了实现的对象。RMI基本分布式应用:服务器端软件import

java.rmi.*;import

java.rmi.server.*;publicclassSomeImplextendsUnicastRemoteObject

implementsSomeInterface{publicStringsomeMethod1()throwsRemoteException{//codetobesupplied}publicintsomeMethod2()throwsRemoteException{//codetobesupplied}}//endclass1)远程接口实现远程接口实现类的一个通用模板RMI基本分布式应用:服务器端软件1)远程接口实现import

java.rmi.*;import

java.rmi.server.*;publicclassHelloImplextendsUnicastRemoteObjectimplementsHelloInterface{publicHelloImpl()throwsRemoteException{super();}publicStringsayHello(Stringname)throwsRemoteException{return"WELCOMETORMI!Goodafternoon!"+name+".";}}//endclassRMI基本分布式应用:服务器端软件1)远程接口实现RMI基本分布式应用:服务器端软件2)stub和skeleton生成在RMI中,分布式对象需要为每个对象服务器和对象客户提供代理,分别成为对象skeleton和stub。这些代理可通过使用JavaSDK提供的RMI编译器rmic,编译远程接口实现生成。可在命令行下输入下述命令生成stub和skeleton文件:rmic<classnameoftheremoteinterfaceimplementation>例如:rmicSomeImplRMI基本分布式应用:服务器端软件2)stub和skeleton生成如果编译成功,将生成两个代理文件,每个文件的名都以实现类的类名为前缀:SomeImpl_stub.classSomeImpl_skel.class但在Java2版本以上的平台下,只生成stub文件。对象的stub文件及远程接口文件,必须被每个对象客户所共享:这些文件是编译客户程序时所必须的文件。可以手工为对象客户提供每个文件的一个拷贝。此外JavaRMI具有stub下载特征,允许客户端动态获取stub文件。RMI基本分布式应用:服务器端软件3)对象服务器的实现SomeImplexportedObj=newSomeImpl();startRegistry(1234);registryURL="rmi://localhost:"+portNum+"/some";Naming.rebind(registryURL,exportedObj);listRegistry(registryURL);主机名

端口号引用名类Naming提供从注册表获取和存储引用的方法。具体来说,rebind方法允许如下形式URL将对象引用存储到注册表中:主机名应该是服务器名,或简写成localhost,引用名指用户选择的名称,该名称在注册表中应该是惟一的。rebind方法将覆盖注册表中与给定引用名绑定的任何引用。如果不希望覆盖,可以使用bind方法。URL:rmi://<hostname>:<portnumber>/<referencename>//检查RMI注册表当前是否运行在默认端口上。如果不在,RMI注册表将被激活。RMI基本分布式应用:服务器端软件3)对象服务器的实现此外,可以使用JDK中的rmiregistry工具在系统提示符输入下列命令,手工激活RMI注册表:rmiregistry<portnumber>

端口号(默认1099)RMI对象服务器是并发服务器:每个对象客户请求都使用服务器上的一个独立线程服务。由于远程方法调用可并发执行,因此远程对象实现的线程安全性非常重要。RMI基本分布式应用:服务器端软件3)对象服务器的实现RMI基本分布式应用:客户端软件查找远程对象:如果对象服务器先前在注册表中保存了对象引用,可以用类Naming的lookup方法获取这些引用。注意,应将获取的引用传给远程接口类。StringregistryURL="rmi://localhost:"+portNum+"/some";SomeInterfaceh=(SomeInterface)Naming.lookup(registryURL);调用远程方法:远程接口引用可以调用远程接口中的任何方法,例如:Stringmessage=h.method1();System.out.println(message);注意,调用远程方法的语法与调用本地方法相同。RMI应用构建步骤总结1)服务器端软件开发算法为该应用的所有待生成文件创建一个目录。在SomeInterface.java中定义远程服务器接口。编译并修改程序,直到不再有任何语法错误。SomeImpl.java中实现接口,编译并修改程序,直到不再有任何语法错误。使用RMI编译器rmic处理实现类,生成远程对象的stub文件

rmicSomeImpl可以从目录中看到新生成文件SomeImpl_Stub.class,每次修改接口实现时,都要重新执行步骤3和步骤4创建对象服务器程序SomeServer.java,编译并修改程序,直到不再有任何语法错误。激活对象服务器javaSomeServerRMI应用构建步骤2)客户端软件开发算法为该应用的所有待生成文件创建一个目录获取远程接口类文件的一个拷贝,也可获取远程接口源文件的一个拷贝,使用javac编译程序,生成接口文件。获取接口实现stub文件SomeImpl_stub.class的一个拷贝开发客户程序SomeClient.java,编译程序,生成客户类激活客户javaSomeClientRMI应用构建步骤2)客户端软件开发算法客户类程序与任何其他Java类相似。RMI所需的语法包括定位服务器主机的RMI注册表和查找服务器对象的远程引用;该引用随后可被传到远程接口类和被调用的远程方法查找远程对象:如果对象服务器先前在注册表中保存了对象引用,可以用类Naming的lookup方法获取这些引用。注意,应将获取的引用传给远程接口类。

StringregistryURL="rmi://localhost:"+portNum+"/some";

SomeInterfaceh=(SomeInterface)Naming.lookup(registryURL);调用远程方法:远程接口引用可以调用远程接口中的任何方法,例如:

Stringmessage=h.method1();System.out.println(message);注意,调用远程方法的语法与调用本地方法相同。RMI应用构建步骤2)客户端软件开发算法基本RMI应用程序演示RMI应用的HelloWorld实现程序:HelloInterface.javaHelloImpl.javaHelloServer.javaHelloClient.javaHelloWorld程序演示RMI应用构建步骤3)测试和调试构建最小RMI程序的一个模板。从一个远程接口开始,其中包括一个方法签名,一个stub实现,一个输出对象的服务器程序以及一个足以用来调用远程方法的客户程序。在单机上测试模板程序,直到远程方法调用成功。每次在接口中增加一个方法签名。每次增加后都修改客户程序来调用新增方法。完善远程方法定义内容,每次只修改一个。在继续下一个方法之前,测试并彻底调试每个新增方法。完全测试所有远程方法后,采用增量式方法开发客户应用。每次增加后,都测试和调试程序。将程序部署到多台机器上,测试并调试。RMI和socketAPI的比较远程方法调用API作为分布式对象计算范型的代表,是构建网络应用的有效工具。它可用来取代socketAPI快速构建网络应用。在RMIAPI和socketAPI之间权衡时,需要考虑以下因素:1)socketAPI的执行与操作系统密切相关,因此执行开销更小,RMI需要额外的中间件支持,包括代理和目录服务,这些不可避免地带来运行时开销。对有高性能要求的应用来说,socketAPI仍将是惟一可行途径。2)RMIAPI提供了使软件开发任务更为简单的抽象。用高级抽象开发的程序更易理解,因此也更易调试。RMI和socketAPI的比较由于运行在低层,socketAPI通常是平台和语言独立的,RMI则不一定。例如JavaRMI需要特定的Java运行时支持。结果是,使用JavaRMI实现的应用必须用Java编写,并且也只能运行在Java平台上。在设计应用系统时,是否能选择适当的范型和API是非常关键的。依赖于具体环境,可以在应用的某些部分使用某种范型或API,而在其他部分使用另一种范型或API。由于使用RMI开发网络应用相对简单,RMI是快速开发应用原型的一个很好的候选工具。提纲进程间通信Socket编程RMI编程P2P编程P2P的定义P2P,即Peer-to-Peer的缩写,常称它为“点对点”或者“端对端”,而学术界常称它为“对等计算”。P2P是一种以非集中化方式使用分布式资源来完成计算任务的一种分布式计算模式。非集中化:P2P系统中并非采用传统的以服务器为中心管理所有客户端的方法,而是消除“中心”的概念,将原来的客户端视为服务器和客户端的综合体;分布式资源:P2P系统的参与者共享自己的一部分空闲资源供系统处理关键任务所用,这些资源包括处理能力、数据文件、数据存储和网络带宽等。P2P的优点P2P技术打破了传统的Client/Server(缩写为C/S)模式,在P2P网络中所有结点的地位都是对等的,每个结点既充当服务器,又充当客户端,这样缓解了中心服务器的压力,使得资源或任务处理更加的分散化。由于P2P网络中结点是Client和Server的综合体,因此结点也被形象地称为“SERVENT”。C/S模式与P2P模式对比C/S模式P2P模式C/S模式与P2P模式对比C/S模式:服务器和客户端之间是一对多的主从关系,系统的信息和数据都保存在中心服务器上若要索取信息,必须先访问服务器,才能得到所需的信息,且客户端之间是没有交互能力的。P2P模式:不区分提供信息的服务器和请求信息的客户端,每一个结点都是信息的发布者和请求者,对等结点之间可以实现自治交互,无需使用服务器。每个对等结点都可以在网络中发布和分享信息,使得网络中闲散的资源得到充分利用。不需要花费高昂的费用来维护中心服务器。基于P2P范型的即时聊天系统开发由于演示的是简单的P2P即时聊天系统,所以,我们仅仅设计了如下几个功能:(1)点对点单人聊天;(2)多人同时在线聊天;(3)用户可以自由加入和退出系统;(4)具备用户在线状态监视。1)确定系统实现功能为了更好地理解P2P分布式计算模式和P2P应用的开发方法,本节使用JavaSocket来实现一个简单的基于P2P范型的即时聊天系统。系统的功能基于P2P范型的即时聊天系统开发为了简单起见,我们采用类似于中心化拓扑结构的P2P模式,所有客户都需要与中心服务器相连,并将自己的网络地址写入服务器中,服务器只需要监听和更新用户列表信息,并发送给客户最新的用户列表信息即可。当需要点对点聊天时,客户端只需要从本地用户列表中读取目标用户的网络地址,并连接目标用户,即可实现通信。因为是P2P系统,客户端要同时扮演服务器和客户端两个角色,所以,用户登录后都会创建一个接收其他用户连接的监听线程,以实现服务器的功能。2)确定P2P模式基于P2P范型的即时聊天系统开发创建Socket、绑定地址和端口号,监听并接受客户端的连接请求。服务器端在客户连接后自动获取客户端用户名、IP地址和端口号,并将其保存在服务器端的用户列表中,同时更新所有在线用户的客户端在线用户列表信息,以方便客户了解上下线的实时情况,以进行聊天。当有用户下线时,服务器端要能即时监听到,并更新用户列表信息,发送给所有在线客户端。对在线用户数量进行统计。3)确定服务器主要任务基于P2P范型的即时聊天系统开发客户端创建Socket,并调用connect()函数,向中心服务器发送连接请求。客户端在登录后也必须充当服务器,以接收其他用户的连接请求,所有需要创建一个用户接收线程来监听。用户登录后需要接收来自服务器的所有在线用户信息列表,并更新本地的用户列表信息,以方便选择特定用户进行聊天。客户端可以使用群发功能,向在线用户列表中的所有用户发送聊天信息。4)确定客户端主要任务基于P2P范型的即时聊天系统开发服务器主要任务客户端主要任务创建Socket、绑定地址和端口号,监听并接受客户端的连接请求自动获取客户端用户名、IP地址和端口号,并将其保存在服务器端的用户列表中,同时更新所有在线用户的客户端在线用户列表信息当有用户下线时,服务器端要能即时监听到,并更新用户列表信息,发送给所有在线客户端。对在线用户数量进行统计。创建Socket,并调用connect()函数,向中心服务器发送连接请求。在登录后也必须充当服务器,接收其他用户的连接请求,需要创建一个用户接收线程来监听用户登录后需要接收来自服务器的所有在线用户信息列表,并更新本地的用户列表信息客户端可以使用群发功能,向在线用户列表中的所有用户发送聊天信息注意,服务器向所有客户发送最新用户列表信息,及客户端的群发功能,都是通过简单地遍历用户列表来实现。基于P2P范型的即时聊天系统开发中心服务器启动后会自动创建一个监听线程,以接受客户端发来的连接请求。当客户端与服务器连接后,客户端会将自己的信息(用户名、IP地址和端口号等)写入socket,服务器端从此socket中读取该用户信息,并登记到用户信息列表中。然后,服务器将最新的用户信息列表群发给所有在线的客户端,以便客户端得到最新的用户列表。步骤1、2展示了客户登陆服务器的过程。5)确定交互过程:登陆基于P2P范型的即时聊天系统开发每个连接到中心服务器的客户都会得到最新的用户信息列表。如步骤3所示,若Client2欲与Client3聊天,则Client2检索自己的用户信息列表,得到Client3的用户信息后,便可与Client3进行连接,实现通信。此过程,并不需要中心服务器的干预。5)确定交互过程:通信基于P2P范型的即时聊天系统开发当有一个客户需要下线时,例如图中的Client1,那么Client1首先将下线请求写入socket,中心服务器接收到含有下线请求标记的信息后,Client1便通过握手机制下线(为了安全关闭socket)。Client1安全下线后,中心服务器会将Client1的用户信息从在线列表中删除,并将更新后的用户列表、下线用户名称和当前网络的在线用户情况等群发给所有在线客户端,以便客户端得到最新的在线用户列表。5)确定交互过程:登出基于P2P范型的即时聊天系统开发客户端的群发功能与服务器端的群发类似,都采用遍历用户列表的方法。例如,图中Client3欲与所有在线用户聊天,则只要遍历Client3的在线用户列表,与所有在线用户进行连接,便可以进行群聊。5)确定交互过程:群聊基于P2P范型的即时聊天系统开发6)系统实现类图基于P2P范型的即时聊天系统开发7)确定系统界面:Server端基于P2P范型的即时聊天系统开发7)确定系统界面:Client端基于P2P范型的即时聊天系统开发8)主要类实现说明1)首先设计中心服务器和客户端系统界面。创建中心服务器Server类,派生自JFrame类。同样,创建客户端Client类,也派生自JFrame类。Server和Client都需要实现ActionListener接口,从而对界面上的按钮等动作进行监听。2)创建P2P网络结点Node类,其中包含用户名、IP地址、端口号和一个结点变量next。3)创建RandomPort类用于客户端分配随机可用端口号。4)创建用户列表类UserInfo,它用于维护中心服务器端和客户端的在线用户信息。5)实现中心服务器Server类,Server类中除了包含系统界面上的一些组件成员外,还有用于维护在线用户信息的UserInfo对象、用于连接的ServerSocket对象和Socket对象,及用于套接字输入、出流的对象。6)创建Server端用于与客户端连接的线程ServerReceiveThread类,它主要负责接受客户端的连接请求、更新在线用户列表,并发送给所有客户端等。基于P2P范型的即时聊天系统开发8)主要类实现说明7)实现客户端Client类,除了包含界面上所示的一些组件成员外,还包括用于连接的套接字对象、套接字输入出流、接收其他客户端连接请求的线程对象等。客户端的主要行为包括处理界面按钮产生的动作、给点对点用户或所有用户发送信息、及一个用于与服务器连接,并获取服务器更新用户列表的内部类ComWithServer。8)创建ComWithServer类,它主要负责与服务器连接、创建客户端接收线程、更新用户信息等。9)创建客户端信息接收线程类ClientReceiveThread,当一个Client创建时,会同时为此客户创建一个接收线程,以把自己当做服务器,接收来自其他客户端的聊天信息。10)客户端还需要创建一个线程用于发送自己的信息给连接的类一端,因此创建客户端发送线程ClientSendThread类,它的成员主要包括连接地址、端口、及发送信息,run方法主要负责获取连接的输入出流,然后将自己的聊天信息,写入流中即可。基于P2P范型的即时聊天系统开发9)系统运行详细过程当单击“启动服务器”按钮时,会触发调用类Server的startServer()方法,该方法为服务器选定特定的端口号,并创建服务器端监听线程serverListenThread(服务器端监听线程类ServerListenThread的一个实例),等待客户端的连接请求。同时,服务器还会创建一个线程ServerReceiveThread,用于接收客户端发来的下线请求,并将更新后的用户列表群发给所有用户。当客户端与服务器连接后,会创建一个线程ComWithServer,用于将自己的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论