JavaRMI-10-6-北大計(jì)算機(jī)系java培訓(xùn)講義_第1頁
JavaRMI-10-6-北大計(jì)算機(jī)系java培訓(xùn)講義_第2頁
JavaRMI-10-6-北大計(jì)算機(jī)系java培訓(xùn)講義_第3頁
JavaRMI-10-6-北大計(jì)算機(jī)系java培訓(xùn)講義_第4頁
JavaRMI-10-6-北大計(jì)算機(jī)系java培訓(xùn)講義_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、9.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例用RMI編寫一個(gè)分布式應(yīng)用,核心有以下三方面:定位遠(yuǎn)程對(duì)象1. 一個(gè)應(yīng)用可以利用RMI的名字服務(wù)功能注冊(cè)器遠(yuǎn)程對(duì)象。2. 可以象操作普通對(duì)象一樣傳送并返回一個(gè)遠(yuǎn)程對(duì)象的引用(指針)。與遠(yuǎn)程對(duì)象通信:底層的通信由RMI實(shí)現(xiàn),對(duì)于系統(tǒng)開發(fā)人員來說,遠(yuǎn)程調(diào)用和標(biāo)準(zhǔn)的Java方法調(diào)用沒有什么區(qū)別。為需要傳遞的對(duì)象裝載類的字節(jié)碼RMI允許調(diào)用者向遠(yuǎn)程對(duì)象傳遞一個(gè)對(duì)象,因此 RMI提供這種裝載對(duì)象的機(jī)制。1本資源由 寒秀草與巧克力 搜集與網(wǎng)絡(luò)請(qǐng)您在傳播的時(shí)候?qū)⑾螺d分?jǐn)?shù)設(shè)為0真正體現(xiàn)資源共享的理念謝謝更多0分資料去我的文庫29.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例Web Se

2、rverClient ServerWeb ServerregistryURL protocolRMIRMIURL protocolURL protocolRMI39.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例Compute enginServerRemote objectClienttaskClienttaskClienttask 一、問題的提出49.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例分布特點(diǎn):engin開發(fā),先運(yùn)行,task后定義.寫engin時(shí)不對(duì)執(zhí)行什么任務(wù)作任何規(guī)定.任務(wù)可以是任意定制的.前提條件:定義任務(wù)的類,要規(guī)定任務(wù)的實(shí)現(xiàn)步驟,使得這個(gè)任務(wù)能夠提交給engin去執(zhí)行.使用server上的 C

3、PU資源. 技術(shù)支持:RMI的動(dòng)態(tài)裝載功能.59.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例遠(yuǎn)程對(duì)象clientserverAm1遠(yuǎn)程方法A.m1()遠(yuǎn)程對(duì)象必須繼承遠(yuǎn)程接口確定那些方法是遠(yuǎn)程方法,為此定義遠(yuǎn)程接口遠(yuǎn)程接口只負(fù)責(zé)提供方法名,不一共實(shí)現(xiàn)細(xì)節(jié),因此必須由一個(gè)對(duì)象來實(shí)現(xiàn)接口executeTaskcomputeengineComputeexecuteTask69.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例二、設(shè)計(jì)一個(gè)服務(wù)器核心協(xié)議:提交任務(wù),執(zhí)行任務(wù),返回結(jié)果clientclient在java中遠(yuǎn)程調(diào)用是通過定義遠(yuǎn)程接口來實(shí)現(xiàn)的, 一個(gè)接口只能有一個(gè)方法不同類型的任務(wù),只要他們實(shí)現(xiàn)了Task類型,就可以在

4、engin上運(yùn)行.實(shí)現(xiàn)這個(gè)接口的類,可以包含任何任務(wù)計(jì)算需要的數(shù)據(jù)以及和任何任務(wù)計(jì)算需要的方法.79.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例(1)定義遠(yuǎn)程接口第一個(gè)接口:computepackage compute;import java.rmi.Remote;import java.rmi.RemoteException;public interface Compute extends Remote Object executeTask(Task t) throws RemoteException;package compute;import java.io.Serializable;public

5、 interface Task extends Serializable Object execute(); 第二個(gè)接口:定義一個(gè)task類型,作為參數(shù)傳給executeTask方法,規(guī)定了engin與它的任務(wù)之間的接口,以及如何啟動(dòng)它的任務(wù).它 不是一個(gè)遠(yuǎn)程接口executeTaskcomputeengineComputeexecuteTask89.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例Compute engin的設(shè)計(jì)要考慮以下問題:1. compute engine是一個(gè)類 ComputeEngine ,它實(shí)現(xiàn)了 Compute接口,只要調(diào)用該類的方法executeTask, 任務(wù)就能提交上來.

6、2. 提交任務(wù)的Client 端程序并不知道任務(wù)是被下載到engin上執(zhí)行的.因此client在定義任務(wù)時(shí)并不需要包含如何安裝的server端的代碼.3. 返回類型是對(duì)象,如果結(jié)果是基本類型,需要轉(zhuǎn)化成相應(yīng)的對(duì)等類.4. 用規(guī)定任務(wù)如何執(zhí)行的代碼填寫execute方法. 99.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例(2)實(shí)現(xiàn)遠(yuǎn)程接口一般說來,實(shí)現(xiàn)一個(gè)遠(yuǎn)程接口的類至少有以下步驟:1. 聲明遠(yuǎn)程接口2. 為遠(yuǎn)程對(duì)象定義構(gòu)造函數(shù)3. 實(shí)現(xiàn)遠(yuǎn)程方法engin中創(chuàng)建對(duì)象的工作可以在實(shí)現(xiàn)遠(yuǎn)程接口類的main函數(shù)中實(shí)現(xiàn):1. 創(chuàng)建并安裝安全管理器2. 創(chuàng)建一個(gè)或更多的遠(yuǎn)程對(duì)象的實(shí)例3. 至少注冊(cè)一個(gè)遠(yuǎn)程對(duì)象109

7、.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例package engine;import java.rmi.*; import java.rmi.server.*; import compute.*;public class ComputeEngine extends UnicastRemoteObject implements Compute public ComputeEngine() throws RemoteException super(); public Object executeTask(Task t) return t.execute(); public static void main

8、(String args) if (System.getSecurityManager() = null) System.setSecurityManager(new RMISecurityManager(); String name = /host/Compute; try Compute engine = new ComputeEngine(); Naming.rebind(name, engine); System.out.println(ComputeEngine bound); catch (Exception e) System.err.println(ComputeEngine

9、exception: + e.getMessage(); e.printStackTrace(); 119.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例在構(gòu)造函數(shù)中,通過super(), a UnicastRemoteObject 被啟動(dòng),即它可以偵聽客戶端來的請(qǐng)求輸入只有一個(gè)遠(yuǎn)程方法,參數(shù)是客戶端遠(yuǎn)程調(diào)用這個(gè)方法時(shí)傳來的任務(wù).這個(gè)任務(wù)被下載到engin,遠(yuǎn)程方法的內(nèi)容就是調(diào)用客戶端任務(wù)的方法,并把結(jié)果回送給調(diào)用者.實(shí)際上這個(gè)結(jié)果是在客戶的任務(wù)的方法中體現(xiàn)的.executeTaskcomputeengineComputeexecuteTaskcallexecuteTask(task)129.6 一個(gè)RMI

10、的分布式應(yīng)用的實(shí)例參數(shù)傳遞規(guī)則:1. 遠(yuǎn)程對(duì)象通常通過引用傳遞.一個(gè)遠(yuǎn)程對(duì)象的引用是一個(gè)stub,它是客戶端的代理.它實(shí)現(xiàn)遠(yuǎn)程對(duì)象中的遠(yuǎn)程接口的內(nèi)容2. 本地對(duì)象通過串行化拷貝到目的. 如果不作制定,對(duì)象的所有成員都將被拷貝. 139.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例通過引用傳遞一個(gè)對(duì)象,意味著任何由于遠(yuǎn)程調(diào)用引起的變化都能反映在原始的對(duì)象中。當(dāng)傳遞一個(gè)遠(yuǎn)程對(duì)象時(shí),只有遠(yuǎn)程接口是可用的, 而在實(shí)現(xiàn)類中定義的方法或者是非遠(yuǎn)程接口中的方法,對(duì)接收者來說是不可用的在遠(yuǎn)程方法調(diào)用中,參數(shù),返回值,異常等非對(duì)象是值傳送. 這意味著對(duì)象的拷貝被傳送到接受方。任何在對(duì)象上發(fā)生的變化不影響原始的對(duì)象一旦服務(wù)器

11、用rmi注冊(cè)了,main方法就存在了,不需要一個(gè)守護(hù)線程工作維護(hù)服務(wù)器的工作狀態(tài),只要有一個(gè)computer engin的引用在另一個(gè)虛擬機(jī),computer engin就不會(huì)關(guān)閉149.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例三、實(shí)現(xiàn)一個(gè)客戶程序目標(biāo):創(chuàng)建一個(gè)任務(wù),并規(guī)定如何執(zhí)行這個(gè)任務(wù)。clientPicomputePipackage compute;public interface Task extends java.io.Serializable Object execute();task不是遠(yuǎn)程接口,但是需要傳遞到服務(wù)器,因此用串行化ExecuteTask()execute()159.6 一

12、個(gè)RMI的分布式應(yīng)用的實(shí)例computePi的作用裝載安全管理器生成一個(gè)遠(yuǎn)程對(duì)象 comp生成任務(wù)對(duì)象Look up(ComputeEngin),獲得了stubsPi task=new Pi()調(diào)用ComputeEngin的遠(yuǎn)程方法獲得計(jì)算結(jié)果Comp.executeTask(task)169.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例package client;import java.rmi.*; import java.math.*; import compute.*;public class ComputePi public static void main(String args) if (S

13、ystem.getSecurityManager() = null) System.setSecurityManager(new RMISecurityManager(); try String name = / + args0 + /Compute; Compute comp = (Compute) Naming.lookup(name); Pi task = new Pi(Integer.parseInt(args1); BigDecimal pi = (BigDecimal) (comp.executeTask(task); System.out.println(pi); catch (

14、Exception e) System.err.println(ComputePi exception: + e.getMessage(); e.printStackTrace(); 179.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例Pi的作用computepirmiregistryCompute engin實(shí)現(xiàn)Task接口實(shí)現(xiàn)execute算法189.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例package client; import compute.*; import java.math.*;public class Pi implements Task private static final BigDe

15、cimal ZERO = BigDecimal.valueOf(0); private static final BigDecimal ONE = BigDecimal.valueOf(1); private static final BigDecimal FOUR = BigDecimal.valueOf(4); private static final int roundingMode = BigDecimal.ROUND_HALF_EVEN; public Pi(int digits) this.digits = digits; 199.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例public Ob

16、ject execute() return computePi(digits); * pi/4 = 4*arctan(1/5) - arctan(1/239)*public static BigDecimal computePi(int digits) int scale = digits + 5; BigDecimal arctan1_5 = arctan(5, scale); BigDecimal arctan1_239 = arctan(239, scale); BigDecimal piarctan1_5.multiply(FOUR).subtract(arctan1_239).mul

17、tiply(FOUR); return pi.setScale(digits, BigDecimal.ROUND_HALF_UP); 209.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例 /* * Compute the value, in radians, of the arctangent of * the inverse of the supplied integer to the speficied * number of digits after the decimal point. The value * is computed using the power series expansion

18、 for the * arctangent: * arctan(x) = x - (x3)/3 + (x5)/5 - (x7)/7 + * (x9)/9 . */ 219.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例public static BigDecimal arctan(int inverseX, int scale) BigDecimal result, numer, term; BigDecimal invX = BigDecimal.valueOf(inverseX); BigDecimal invX2 = BigDecimal.valueOf(inverseX * inverseX); n

19、umer = ONE.divide(invX, scale, roundingMode); result = numer; int i = 1; do numer =numer.divide(invX2, scale, roundingMode); int denom = 2 * i + 1; term = numer.divide(BigDecimal.valueOf(denom), scale, roundingMode); if (i % 2) != 0) result = result.subtract(term); else result = result.add(term); i+

20、; while (pareTo(ZERO) != 0); return result; 229.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例由于Rmi的存在,系統(tǒng)可以做到:1、可以直接通過名字定位遠(yuǎn)程方法的位置2、以參數(shù)的形式將一個(gè)對(duì)象傳遞給一個(gè)遠(yuǎn)程方法3、可以使一個(gè)對(duì)象到另外一個(gè)虛擬機(jī)上運(yùn)行4、計(jì)算結(jié)果可以返回239.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例將接口,遠(yuǎn)程對(duì)象,客戶代碼分成三個(gè)程序包:1. compute ( Compute and Task interfaces) 2. engine ( ComputeEngine implementation class and its stub) 3. cl

21、ient ( ComputePi client code and Pi task implementation) 249.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例接口compute對(duì)于編程雙方都是需要的,通常將接口文件打成包,分發(fā)給server和client的開發(fā)者: 假設(shè)接口的開發(fā)者將寫好的接口程序放在c:homewaldosrccompute目錄下cd c:homewaldosrcjavac computeCompute.javajavac computeTask.javajar cvf compute.jar compute*.class259.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例類文件必須是網(wǎng)絡(luò)可

22、訪問的,rmi利用URL定位類文件假設(shè) ComputeEngine.java 存放在 c:homeannsrcengine 假設(shè) compute.jar存放在 c:homeannpublic_htmlclasses. 設(shè)置環(huán)境變量CLASSPATH=c:homeannsrc;c:homeannpublic_htmlclassescompute.jar269.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例編譯 ComputeEngine.java,產(chǎn)生一個(gè) stub,并使stub是網(wǎng)絡(luò)可訪問的. 產(chǎn)生stub的命令是rmic,生成的文件形式為: className_Stubs.class和className_

23、skeleton.class命令如下:cd c:homeannsrcjavac engineComputeEngine.javarmic -d . engine.ComputeEnginemd c:homeannpublic_htmlclassesenginecopy engineComputeEngine_*.class c:homeannpublic_htmlclassesengine279.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例展開接口文件cd c:homeannpublic_htmlclassesjar xvf compute.jar289.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例執(zhí)行程序1. 在啟

24、動(dòng)compute engine之前, 首先要啟動(dòng)RMI的 registry。unset CLASSPATHstart rmiregistry2. 啟動(dòng)Server.確認(rèn)compute.jar文件和實(shí)現(xiàn)遠(yuǎn)程對(duì)象的類在指定的class路徑下set CLASSPATH=c:homeannsrc;c:homeannpublic_htmlclassescompute.jar299.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例啟動(dòng) compute engine時(shí),要規(guī)定服務(wù)器端的類在什么情況下是可用的。啟動(dòng)Compute enginejava -Djava.rmi.server.codebase= :homeannp

25、ublic_htmlclasses/ -Djava.rmi.server.hostname= -Djava.security.policy=java.policy engine.ComputeEngine 309.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例3. 啟動(dòng) Client指定類(pi)的位置 set CLASSPATH=c:homejonessrc;c:homejonespublic_htmlclassescompute.jar-java -Djava.rmi.server.codebase= :homejonespublic_htmlclasses/ -Djava.security.polic

26、y=java.policyclient.ComputePi localhost 20輸入完上述命令后,得到結(jié)果 3.149323846319.6 一個(gè)RMI的分布式應(yīng)用的實(shí)例329.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例windowsNT(C+)Sun(Java)Netscape(COBOL)client339.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例CORBA技術(shù)和Java技術(shù)的結(jié)合-Java IDL什么是IDL?IDL是CORBA規(guī)范中的接口定義語言,不依賴于任何具體的編程語言.CORBA提供了到各種不同語言的IDL映射.Java IDL是CORBA到Java的映射,使Java也支持CO

27、RBA規(guī)范Java IDL和Java RMI非常相似,RMI只支持Java語言寫的分布對(duì)象,Java IDL可以和CORBA支持的任何一種語言編寫的ORB對(duì)象進(jìn)行交互Java RMI和Java IDL目前使用的通信協(xié)議不同,分別是JRMP和IIOP.349.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例在Java IDL中,客戶端通過引用與遠(yuǎn)程的對(duì)象進(jìn)行交互,即客戶機(jī)使用stubs對(duì)遠(yuǎn)程服務(wù)器上的對(duì)象進(jìn)行操作,但并不拷貝服務(wù)器上的對(duì)象.Java RMI即可以通過引用,也可以將對(duì)象下載到本地機(jī)上運(yùn)行(因?yàn)橛写谢δ?.Java實(shí)現(xiàn)簡單,但語言不兼容Java IDL則可以充分發(fā)揮語言無關(guān)的優(yōu)勢359.

28、7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例IDL Java的技術(shù)組成:IDL至Java的編譯器:idltojava生成客戶端的stubs和服務(wù)器端的skeletonCORBA API 和 ORB一個(gè)簡單的名字服務(wù)369.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例IDL接口IDL編譯器(C+, Java)服務(wù)程序IDL Stub客戶應(yīng)用對(duì)象實(shí)現(xiàn)SkeletonC+, Java編譯器C+, Java編譯器客戶程序應(yīng)用開發(fā)者379.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例ORB內(nèi)核BOAIDL SkeletonIDL文件IDL編譯器對(duì)象實(shí)現(xiàn)應(yīng)用開發(fā)者事件感知部分事件適配部分 事件處理分發(fā)部分 事件處理部

29、分從反應(yīng)式Agent的角度看389.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例CORBA編程實(shí)例運(yùn)行在瀏覽器中的客戶對(duì)象與遠(yuǎn)程的服務(wù)對(duì)象交互,客戶端的表現(xiàn)是在瀏覽器中點(diǎn)擊一個(gè)button,就會(huì)在一個(gè)文本域中返回服務(wù)端的時(shí)間,同時(shí)也在服務(wù)端的標(biāo)準(zhǔn)輸出上打印該時(shí)間。buttonThe data in server side is2000.6.112:56:00server時(shí)間是一個(gè)對(duì)象399.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例ORBCLIENTSTUBSSKELETONSSERVERORBIIOPMETHOD REQUESTOBJECT REFERENCESERVANT409.7 基于CORB

30、A的分布式應(yīng)用系統(tǒng)的實(shí)例1. 首先是定義交互接口,在文件dateit.idl中。module TheDate (相當(dāng)于包) interface DateIt string dateit(); ;2. 用IDL接口到Java語言的映射jidl dateit.idl 該命令會(huì)生成幾個(gè)相關(guān)的java文件:DateIt.javaDateItHelper.javaDateItHolder.java _DateItImplBase.javaStubForDateIt.java419.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例3. 編寫服務(wù)對(duì)象的程序,在文件DateIt_impl.java中package T

31、heDate; / jidl 產(chǎn)生的Java文件放在TheDate包中import org.omg.CORBA.*; import java.io.*;import java.awt.*;import java.util.Date;import java.lang.System;public class DateIt_impl extends _DateItImplBase /擴(kuò)展了 jidl 生成的抽象類_DateItImplBase String date_time; public String dateit() date_time=(new Date().toString(); /獲取時(shí)

32、間 System.out.println(date_time); return date_time;/ 向客戶端返回時(shí)間串 429.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例4. 編寫服務(wù)方的程序,在文件Server.java中。package TheDate; import org.omg.CORBA.*;import java.io.*;public class Server public static void main(String args) try / 創(chuàng)建ORB和BOA對(duì)象實(shí)例 ORB orb = ORB.init(args, new java.util.Properties();

33、 / 生成服務(wù)對(duì)象實(shí)例 BOA boa = orb.BOA_init(args); DateIt_impl p = new DateIt_impl(); /創(chuàng)建服務(wù)對(duì)象實(shí)例439.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例/ 保存引用try String ref = orb.object_to_string(p); /將對(duì)象編碼成字符串 String refFile = date.ref; file = new (refFile); PrintStream out = new PrintStream(file); out.println(ref); /存入文件date.ref中 out.flus

34、h(); (); catch(IOException ex) System.err.println(Cant write to +ex.getMessage(); System.exit(1); 449.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例/將引用存入html文件中,參見后面列出的date.html 文try String ref = orb.object_to_string(p); String refFile = c:InetpubDocsdate.html; file = new (refFile); PrintStream out = new PrintStream(file);

35、out.println(); 459.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例/指由Client.java編譯成的class文件out.println(); /將由服務(wù)對(duì)象轉(zhuǎn)化成的字符串存入超文本文件中out.println();out.println();name=org.omg.CORBA.ORBSingletonClass + value out.println();out.flush(); (); /這樣瀏覽器調(diào)入該超文本頁面時(shí),會(huì)運(yùn)行Client.class的applet,并將包含標(biāo)識(shí)服務(wù)對(duì)象的字符串由參數(shù)ior傳遞給applet。 catch(IOException ex) System.err.println(“Cant write to ”+ex.getMessage()+“”); System.exit(1); 469.7 基于CORBA的分布式應(yīng)用系統(tǒng)的實(shí)例/ 服務(wù)對(duì)象就緒,準(zhǔn)備接受請(qǐng)boa.impl_is_ready(null); System.exit(0); catch(S

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論