分布式对象和远程调用.ppt

上传人:za****8 文档编号:14126016 上传时间:2020-07-04 格式:PPT 页数:110 大小:628.51KB
收藏 版权申诉 举报 下载
分布式对象和远程调用.ppt_第1页
第1页 / 共110页
分布式对象和远程调用.ppt_第2页
第2页 / 共110页
分布式对象和远程调用.ppt_第3页
第3页 / 共110页
资源描述:

《分布式对象和远程调用.ppt》由会员分享,可在线阅读,更多相关《分布式对象和远程调用.ppt(110页珍藏版)》请在装配图网上搜索。

1、第4章分布式对象和远程调用,第4章:分布式对象和远程调用,引言分布式对象间的通信远程过程调用RemoteprocedurecallJavaRMI实例研究总结,分布对象技术要解决的基本问题,分布对象技术要解决的基本问题分布式系统的客户/服务器模型N层客户/服务器模型,分布对象技术要解决的基本问题,分布对象技术要解决的基本问题,分布对象技术要解决的基本问题,对象请求代理-支持客户访问异地分布对象的核心机制称为对象请求代理ORB(ObjectRequestBroker),分布对象技术要解决的基本问题,分布对象技术要解决的基本问题,分布式程序设计的模型,远程过程调用(RPC-RemoteProcedu

2、reCall)不同进程之间的过程的调用,但是是相同的语言环境。远程方法调用(RMI-RemoteMethodInvocation)一个进程调用另一个进程中对象的方法,两个进程可以在同一台主机,也可以在不同的主机。事件驱动(Event-basedmodel)注册一些感兴趣的对象的事件事件发生时会的到通知,中间件,中间件层中间件是一种软件,它提供基本的通信模块和其他一些基础服务模块,使得应用程序开发提供平台,中间件要解决的问题,通信协议:独立于网络底层的传输协议。硬件:数据类型在不同的硬件平台上有不同的表示:bigendian,litterendian,可以通过mashell解决。操作系统:在操作

3、系统层上提供更高级的抽象API,屏蔽操作系统的异构编程语言:CORBA通过IDL,可以使得不同的语言写的代码互相调用。中间件技术提供了一个编程的抽象,来屏蔽上述的异质问题。,中间件-分布对象的核心技术,中间件的特性位置透明(Locationtransparency)通信协议(Communicationprotocols)对计算机硬件层的支持对操作系统层的支持对程序设计语言层的支持,接口(Interfaces),接口一个模块的接口包含了其他模块可访问的方法的定义(没有实现)和变量。有些情况,需要调用同一个方法,但是的具体实现的不同,接口可以做到这一点。分布式系统中的接口同一个地址空间,模块之间的

4、通信可以通过访问公共变量,但是远程调用不能直接访问变量只能通过属土参数和输出参数指针不能作为参数传递或者作为结果返回,接口的实例,RPCsServiceinterface对服务器一组过程的说明,定义每个过程的输入输出参数,供客户端调用。RMIsRemoteinterface对一个对象的方法的说明。可以传递一个对象或者远程对象的指针,也可以返回这两种类型,这是与过程调用最大的不同。,接口的实例,接口定义语言(IDLsInterfaceDefinitionLanguages)JavaRMI中可以直接定义接口,只能被java语言调用其它中间件系统提供了IDLs.e.g.CORBAIDL(n1),DC

5、EIDLandDCOMIDL允许用其它语言实现的对象来调用,具有跨平台功能,接口的实例,第4章:分布式对象和远程调用,引言分布式对象间的通信远程过程调用Remoteprocedurecall事件与通知EventsandnotificationsJavaRMI实例研究总结,分布式对象间的通信,对象模型(Theobjectmodel)分布式对象(Distributedobjects)分布式对象模型(Thedistributedobjectmodel)设计问题实现分布式垃圾回收,对象模型,对象的引用(objectreference)访问对象,必须知道对象的引用。可以作为参数的传递,也可以作为结果返回

6、接口(interface)动作(Actions)一个对象调用了另一个对象的方法则触发一个动作,两个作用:对象的状态发生改变生成一个新的对象连锁的调用异常(Exceptions)垃圾回收(Garbagecollection),分布式对象,除了对象的属性,分布式对象系统的关键是对象之间的通信引入服务器和客户端的概念客户/服务器模式,对象相当于server,调用该对象方法的程序是client.作为server的对象需要访问其它对象的方法时,它就是client.,分布式对象模型,进程中可以包含多个对象,本地的和远程的。调用其它进程的对象叫远程调用,即使在同一台机器上,不同的地址空间的调用也叫远程调用.

7、提供可被远程调用方法的对象叫远程对象。E.g.Bunsignedintprog;unsignedintvers;unsignedintproc;opaque_authcred;opaque_authverf;parameter1parameter2.;,SunMicrosystemsOpenNetworkComputing.TheONCusesXDRastheexternaldatarepresentationstandard,SunRPCcasestudy小结,RPC把通信接口抽象成程序调用,引入Stub,使得调用远程函数看起来就像本地函数调用。DCERPC引入了IDL语言用于描述程序接口,

8、经过编译之后得到stub,保证了接口的一致性。RPC系统把参数和返回值编码成用来传输的,第5章:分布式对象和远程调用,引言分布式对象间的通信远程过程调用Remoteprocedurecall事件与通知EventsandnotificationsJavaRMI实例研究总结,事件与通知模型,目的让一个对象能够对另一个对象发生的变化做出反应举例:文件被修改了一个电子书签变化了位置发布与订阅(Publish/subscribeparadigm)产生事件一方发布事件的类型接收事件一方订阅感兴趣的事件类型事件放生时,通知订阅一方。分布式事件驱动系统的两个特性:异构性:已有的分布式系统的一些模块原本不是为了

9、互操作而设计的,现在能够让他们协同工作,通过接收方公布远程接口。异步性:不能要求发布程序和订阅程序同步。,事件与通知模型,举例:交易所系统任务:让交易者能够查看他们交易的股票的最新市场行情。系统构成信息提供者(Informationprovider)接收新的交易信息发布股票价格股票价格变化通知交易进程订阅股票价格事件,事件与通知模型,事件与通知模型的结构,事件服务:维护一个发布的事件类型和订阅者兴趣的数据库,使得双方能够耦合起来。,事件与通知模型的结构,兴趣对象是一个对象,由于其方法被调用而改变自身的状态,这种改变会引起其他对象的兴趣。事件兴趣对象的方法被执行的结果叫做事件。通知是一个对象,它

10、包含关于事件的信息(属性,类型等)。订阅者是一个对象,它订阅另一个对象上发生的事件,并接收通知。观察者对象任务是将兴趣对象和其订阅者进行耦合.分担兴趣对象的工作。发布者是一个对象,声明它产生的一些事件的通知,他可以是兴趣对象,也可以是一个观察者。,事件与通知模型的结构,传递语义和进程间消息传递的语义类似,取决于应用需求和所采用的措施。对可靠性要求较低的需求,一些网络游戏了解其它玩家的最新状态,普通IP组播协议。对可靠性要求较高的需求,股票交易所系统。需要采用可靠的组播协议。实时要求。,事件与通知模型的结构,观察者的作用转发代替兴趣对象发送通知。通知过滤减少通知的数量事件模式订阅者可以定制若干事

11、件之间的关系,满足这些关系时才发通知。通知邮箱异步传输,事件与通知模型的结构,RSS是一种用于共享新闻和其他Web内容的数据交换规范,起源于网景通讯公司的推Push技术,将订户订阅的内容传送给他们的通讯协同格式(Protocol)。RSS可以是以下三个解释的其中一个:ReallySimpleSyndication(真正简单的整合)RDF(ResourceDescriptionFramework)SiteSummaryRichSiteSummary(丰富站点摘要)这三个解释都是指同一种Syndication的技术。RSS目前广泛用于blog、wiki和网上新闻频道,世界多数知名新闻社网站都提供R

12、SS订阅支持。,Jini规范,什么是Jini?Jini是Sun公司的研究与开发项目,Jini技术可使范围广泛的多种硬件和软件-即可与网络相连的任何实体-能够自主联网。Jini技术可划分为两个范畴:体系结构和分布式编程。提供在Jini上运行的网络服务。基础结构Jini基础结构解决设备和软件如何与网络连接并进行注册等基本问题。,Jini规范,基础结构的第一种要素称作DiscoveryandJoin,它解决设备和应用程序在对网络一无所知的情况下如何向网络进行首次注册这样的难题。基础结构的第二个要素是Lookup(搜索)。Lookup可被看作网络中所有服务的公告板。NetworkServices-网络

13、服务OtherServices-其它服务Leasing-租用Transactions-交易DistributedEvent-分布式事件OtherOS-其它操作系统OtherCPU-其它CPU,Jini规范,DiscoveryandJoin设备或应用程序插入网络后需要完成的第一个任务就是发现该网络,它就通过一个众所周知的端口向网络发送一个512字节的多路广播Discovery包。在其它信息中,该包包含对自己的引用。,Jini规范,JiniLookup在众所周知的端口上进行监听。当接收到Discovery包后,Lookup就利用该设备的接口将Lookup的接口传递回插接的设备或应用程序。现在,该设

14、备或应用程序已经发现了该网络,并准备将其所有特性上载到JiniLookup。上载特性是DiscoveryandJoin中Join这方面的特性。现在该设备或应用程序使用在Discovery阶段所接收到的Lookup接口与网络相连。上载到Lookup的特性包括该设备或应用程序所提供的所有增值服务(如驱动程序、帮助向导、属性等)。Lookup是网络上所有服务的网络公告板。Lookup不但存储着指向网络上服务的指针,而且还存储着这些服务的代码和/或代码指针。,Jini规范,例如,当打印机向Lookup注册时,打印机将打印机驱动程序或驱动程序接口上载到Lookup。当客户机需要使用打印机时,该驱动程序和

15、驱动程序接口就会从Lookup下载到客户机。这样,就不必事先把驱动程序装载到客户机上。打印机还可能把其它增值服务装载入Lookup。例如,打印机可能存储关于自己的属性(如它是否支持postscript,或它是否为彩色打印机)。打印机还可能存储可在客户机上运行的帮助向导。如果网络上没有Lookup,则网络就会使用一个PeerLookup(对等Lookup)程序。当需要服务的客户机在网络上找不到Lookup时,PeerLookup就开始工作。在这种情况下,客户机可发送与Lookup所用的相同的DiscoveryandJoin包,并要求任何服务供应商进行注册。随后,服务供应商就会在客户机上注册,,J

16、ini规范,分布式编程可提供租用、分布式交易和分布式事件。租用租用与租用一套公寓很类似。我们在租用一套公寓时,一般会商定使用该公寓的时间。类似地,在Jini中,对象彼此之间商定租期。例如,当某设备使用DiscoveryandJoin协议发现网络时,它就注册一段租用时间。在租约到期之前,该设备必须重新商定租期。这样,如果租约到期或设备拔下后,该设备在Lookup中的记录就会被自动删除。这就是分布式垃圾收集的工作原理。,Jini规范,分布式交易在分布式Java环境中,有时需要一种很简便的方法,来确保在整个交易完成之前,在该交易中发生的所有事件都被真正提交了(两阶段提交)。为便于进行此类分布式计算,

17、Jini提供了一种简单的JavaAPI。该API可使对象起动一个能管理交易的交易管理器。每个参与交易的对象都向交易管理器注册。当交易发生时,如果某个参与的对象说,交易中的某个事件没有发生,则此信息就被送回交易管理器。随后,交易管理器就告诉所有参与的对象回滚(roolback)到前一个已知状态。类似地,如果所有对象都完成了其交易的过程,则整个交易就向前进行。Jini上的网络服务在Jini基础结构和分布式编程之上,可提供便于分布式计算的网络服务。JavaSpace就是这样的一种网络服务。,Jini规范,分布式事件在单一的计算机中,事件肯定能被接收方接收到,序列也肯定能按照顺序进行。但在分布式环境中

18、,分布的事件可能不是按照顺序被接收,或者,某个事件还可能丢失。为便于在Java环境中处理分布的事件,Jini为分布的事件提供了一个简单的JavaAPI。例如,当一个分布的事件发生时,该事件都带有一个事件号和序列号。利用这种信息,接收方就能检查事件是否丢失(序列号丢失)或事件是否按照顺序接收(序列号顺序不对)到。,第5章:分布式对象和远程调用,引言分布式对象间的通信远程过程调用Remoteprocedurecall事件与通知EventsandnotificationsJavaRMI实例研究总结,JavaRMI实例研究,remotemethodinvocation(RMI)出现于Jdk1.1(19

19、97.02),在Jdk1.2中改进定位:AccesstoRemoteObjectsClient-ServerProtocolHigh-levelAPIJava-to-JavaonlyTransparentLightweight,JavaRMI实例研究,从RPC到RMI变化:从过程(静态)-面向对象(动态)从函数调用-对实例的操作问题:谁来创建实例对象?什么时候创建?如何取得对象的引用?,JavaRMI实例研究,RMI系统由以下几个部分组成:运行远程服务的服务器需要远程服务的客户端程序远程服务的接口定义(RemoteInterface)远程服务的实现(RemoteService)Stub和Ske

20、leton文件RMI命名服务,使得客户端可以发现远程服务,JavaRMI实例研究,RMI编程编写并编译接口的Java代码编写并编译实现类的Java代码利用RMIC从实现类产生Stub和Skeleton类文件启动注册服务编写远程服务主机(host)程序的Java代码,运行之开发RMI客户端程序的Java代码,运行之,JavaRMI实例研究,RMI应用通常由两部分组成:server,client服务程序:创建远程对象,建立这些对象的引用,等待来自客户端的调用客户端程序:取得远程对象的远程引用,调用其方法.RMI提供了server和client信息传递的机制RMI的这种应用被称为分布式对象应用,Ja

21、vaRMI实例研究-定义接口,远程接口:importjava.rmi.*;publicinterfacecomputeextendsRemotepublicintadd(intx,inty)throwsRemoteException;,JavaRMI实例研究-开发远程对象,importjava.rmi.*;importjava.rmi.server.*;publicclassAdderImplextendsUnicastRemoteObjectimplementsComputepublicAdderImpl()throwsRemoteExceptionpublicintadd(intx,int

22、y)throwsRemoteExceptionreturnx+y;,JavaRMI实例研究-编译远程类,JavaRMI实例研究-生成stubs和skeleton,Stubs和skeletons利用rmic编译器产生Stub和skeleton类是在运行时确定,并动态加载的,JavaRMI实例研究-参数的类型,基本类型值传递远程对象传递引用非远程对象值传递对象序列化(ObjectSerialization)把对象写成字节序列写入流(Stream)在另一端重建根据旧的数据创建一个全新的对象,JavaRMI实例研究-注册,命名和查找远程对象服务器可以注册它们的对象客户端可以发现服务对象并且获取远程引用

23、注册器是运行在主机上的进程,JavaRMI实例研究-注册,RMI包含了一个简单的目录服务,称为RMIRegistry,它运行在每个有远程服务对象的主机上接受服务查询请求,缺省端口是1099.(objectserverswillbedynamicallyassignedportsbytheRMIruntime)支持stub代码的动态下载,JavaRMI实例研究-注册,Server-side创建一个实现远程服务的本地对象导出该对象给RMI(创建一个侦听服务,等待客户端的连接).用一个公开的名称,将该对象注册到RMIRegistry中,JavaRMI实例研究-注册,Client-side通过java

24、.rmi.Naming静态类访问RMIRegistry使用方法lookup()查询注册器,参数是URL:rmi:/:/该方法返回服务对象的远程引用,JavaRMI实例研究-工作过程,JavaRMI实例研究-工作过程,JavaRMI实例研究-工作过程,JavaRMI实例研究-工作过程,一个RMI的分布式应用的实例,一个分布式计算引擎提供计算能力,客户端将计算任务提交给引擎计算,提交的任务要包括:计算步骤,计算引擎将计算结果返回。,一个RMI的分布式应用的实例,用RMI编写一个分布式应用,有以下三个核心问题:定位远程对象1.一个应用可以利用RMI的名字服务功能注册其远程对象。2.可以象操作普通对象

25、一样传送并返回一个运程对象的引用。与远程对象通信:底层的通信由RMI实现,对于系统开发人员来说,远程调用和标准的Java方法调用没有什么区别。为需要传递的对象装载类的字节码RMI允许调用者向远程对象传递一个对象,因此RMI提供这种装载对象的机制。,一个RMI的分布式应用的实例,分布特性:Engin独立开发,并运行,task后定义.写engin时不对执行什么任务作任何规定.任务可以是任意定制的.前提条件:定义任务的类,要规定任务的实现步骤,使得这个任务能够提交给engin去执行.使用server上的CPU资源.技术支持:RMI的动态装载功能.,一个RMI的分布式应用的实例,设计一个服务器核心协议

26、:提交任务,执行任务,返回结果协议的表现形式:engintask不同类型的任务,只要他们实现了Task类型,就可以在engin上运行.实现这个接口的类,可以包含任何任务计算需要的数据以及和任何任务计算需要的方法,一个RMI的分布式应用的实例,Computeengin的设计要考虑以下问题:puteengine是一个类ComputeEngine,它实现了Compute接口,只要调用该类的方法executeTask,任务就能提交上来.2.提交任务的Client端程序并不知道任务是被下载到engin上执行的.因此client在定义任务时并不需要包含如何安装的server端的代码.3.返回类型是对象,如

27、果结果是基本类型,需要转化成相应的对等类.4.用规定任务如何执行的代码填写execute方法.,一个RMI的分布式应用的实例,一个RMI的分布式应用的实例,一般说来,实现一个远程接口的类至少有以下步骤:1.声明远程接口2.为远程对象定义构造函数3.实现远程方法4.engin中端创建对象的工作可以在实现远程接口类的main函数中实现:创建并安装安全管理器创建一个或更多的远程对象的实例至少注册一个远程对象,packageengine;importjava.rmi.*;importjava.rmi.server.*;importcompute.*;publicclassComputeEngineex

28、tendsUnicastRemoteObjectimplementsComputepublicComputeEngine()throwsRemoteExceptionsuper();publicObjectexecuteTask(Taskt)returnt.execute();publicstaticvoidmain(Stringargs)if(System.getSecurityManager()=null)System.setSecurityManager(newRMISecurityManager();Stringname=/host/Compute;tryComputeengine=n

29、ewComputeEngine();Naming.rebind(name,engine);System.out.println(ComputeEnginebound);catch(Exceptione)System.err.println(ComputeEngineexception:+e.getMessage();e.printStackTrace();,一个RMI的分布式应用的实例,在构造函数中,通过super(),aUnicastRemoteObject被启动,即它可以侦听客户端来的请求输入只有一个远程方法,参数是客户端远程调用这个方法时传来的任务.这个任务被下载到engin,远程方法的

30、内容就是调用客户端任务的方法,并把结果回送给调用者.实际上这个结果是在客户的任务的方法中体现的.,一个RMI的分布式应用的实例,参数传递规则:1.远程对象通常通过引用传递.一个远程对象的引用是一个stub,它是客户端的代理.它实现远程对象中的远程接口的内容2.本地对象通过串行化拷贝到目的.如果不作制定,对象的所有成员都将被拷贝.,一个RMI的分布式应用的实例,一旦服务器用日RMI注册了,main方法就存在了,不需要一个守护线程工作维护服务器的工作状态,只要有一个computerengin的引用在另一个虚拟机,computerengin就不会关闭,一个RMI的分布式应用的实例,实现一个客户程序目

31、标:创建一个任务,并规定如何执行这个任务。task不是远程接口,但是需要传递到服务器,因此用序列化。,一个RMI的分布式应用的实例,computePi的作用1.调用远程方法,获得这个方法的引用2.生成一个任务3.要求任务被执行,packageclient;mportjava.rmi.*;importjava.math.*;importcompute.*;publicclassComputePipublicstaticvoidmain(Stringargs)if(System.getSecurityManager()=null)System.setSecurityManager(newRMISe

32、curityManager();tryStringname=/+args0+/Compute;Computecomp=(Compute)Naming.lookup(name);Pitask=newPi(Integer.parseInt(args1);BigDecimalpi=(BigDecimal)(comp.executeTask(task);System.out.println(pi);catch(Exceptione)System.err.println(ComputePiexception:+e.getMessage();e.printStackTrace();,一个RMI的分布式应用

33、的实例,packageclient;importcompute.*;importjava.math.*;publicclassPiimplementsTaskprivatestaticfinalBigDecimalZERO=BigDecimal.valueOf(0);privatestaticfinalBigDecimalONE=BigDecimal.valueOf(1);privatestaticfinalBigDecimalFOUR=BigDecimal.valueOf(4);privatestaticfinalintroundingMode=BigDecimal.ROUND_HALF_E

34、VEN;publicPi(intdigits)this.digits=digits;,publicObjectexecute()returncomputePi(digits);*pi/4=4*arctan(1/5)-arctan(1/239)*publicstaticBigDecimalcomputePi(intdigits)intscale=digits+5;BigDecimalarctan1_5=arctan(5,scale);BigDecimalarctan1_239=arctan(239,scale);BigDecimalpiarctan1_5.multiply(FOUR).subtr

35、act(arctan1_239).multiply(FOUR);returnpi.setScale(digits,BigDecimal.ROUND_HALF_UP);,/*Computethevalue,inradians,ofthearctangentof*theinverseofthesuppliedintegertothespeficied*numberofdigitsafterthedecimalpoint.Thevalue*iscomputedusingthepowerseriesexpansionforthe*arctangent:*arctan(x)=x-(x3)/3+(x5)/

36、5-(x7)/7+*(x9)/9.*/,publicstaticBigDecimalarctan(intinverseX,intscale)BigDecimalresult,numer,term;BigDecimalinvX=BigDecimal.valueOf(inverseX);BigDecimalinvX2=BigDecimal.valueOf(inverseX*inverseX);numer=ONE.divide(invX,scale,roundingMode);result=numer;inti=1;donumer=numer.divide(invX2,scale,roundingM

37、ode);intdenom=2*i+1;term=numer.divide(BigDecimal.valueOf(denom),scale,roundingMode);if(i%2)!=0)result=result.subtract(term);elseresult=result.add(term);i+;while(pareTo(ZERO)!=0);returnresult;,一个RMI的分布式应用的实例engin一方并不需要事先知道它要计算的任务的任何特征。由于Rmi的存在,系统可以做到:1.可以直接通过名字定位远程方法的位置2.参数的形式将一个对象传递给一个远程方法3.可以使一个对象到

38、另外一个虚拟机上运行4.算结果可以返回,一个RMI的分布式应用的实例,将接口,远程对象,客户代码分成三个程序包:pute(ComputeandTaskinterfaces)2.engine(ComputeEngineimplementationclassanditsstub)3.client(ComputePiclientcodeandPitaskimplementation),一个RMI的分布式应用的实例,第5章:分布式对象和远程调用,引言分布式对象间的通信远程过程调用Remoteprocedurecall事件与通知EventsandnotificationsJavaRMI实例研究总结,总结,远程分布式对象的模型远程接口、远程对象引用,远程调用利用分布式对象技术进行系统设计的基本方法RMISunRPC基于事件通知机制的分布式系统的特点,project1,参考讲义完成计算引擎。要求考虑到多个客户端同时将计算任务提交给计算引擎的情况,要求在服务器端建立任务队列。任务提交上来时,先放到一个任务队列中,等待计算引擎的调度。计算引擎顺序的从任务队列中取出任务并计算,在计算完毕后,将任务所得到的结果存放在一个结果队列中。客户端定期查询已提交的任务状态,直到获得计算结果。体现atleast-once在工程报告中指明那些代码用来实现atleast-once语义。,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!