java語言網(wǎng)絡socket課件_第1頁
java語言網(wǎng)絡socket課件_第2頁
java語言網(wǎng)絡socket課件_第3頁
java語言網(wǎng)絡socket課件_第4頁
java語言網(wǎng)絡socket課件_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Java網(wǎng)絡通信網(wǎng)絡的基本概念Socket通信數(shù)據(jù)報掌握網(wǎng)絡通信的基本原理學會Socket類的運用學會Datapacket類的應用課程目標學習完本課程,您應該能夠:第一節(jié)網(wǎng)絡的基本概念IP地址(NovellNetware(IPX/SPX),NetBIOS(NetBEUI))主機名(hostname)端口號(portnumber)如:80(http),21(ftp),23(telnet),25(SMTP)通信協(xié)議IP地址是計算機網(wǎng)絡中任意一臺計算機地址的惟一標識。如主機名是計算機網(wǎng)絡中一臺計算機的標識名,也可以看作是IP地址的助記名。如主機名IP地址1.幾個重要概念端口號和通信協(xié)議端口號是用一個16位的整數(shù)來表達的,其范圍為0-65535,其中0-1023為系統(tǒng)所保留有一套通信規(guī)則保證網(wǎng)絡上可靠高效的數(shù)據(jù)傳輸端口號傳輸層協(xié)議用端口號來標識和區(qū)分各種上層應用程序。套接字(Socket)=IP+端口號HTTPFTPTelnetSMTPDNSTFTPSNMPTCPUDPIP數(shù)據(jù)包套接字8020/2123255369161QQTCP/IP協(xié)議和OSI參考模型TCP/IP協(xié)議棧具有簡單的分層設計,與OSI參考模型有清晰的對應關系。TCP/IP應用層表示層會話層傳輸層網(wǎng)絡層數(shù)據(jù)鏈路層物理層1234567應用層傳輸層網(wǎng)絡層數(shù)據(jù)鏈路層物理層OSI參考模型TCP/IP如何使用TCP端口號服務器IP:主機Telnet,目的端口23102823源端口目的端口IP地址URL和信息定位URL語法格式:<傳輸協(xié)議名>://<主機名>:<端口號>/<文件名>#<引用>統(tǒng)一資源定位器(URL)uniformresourcelocator指出網(wǎng)站中某個網(wǎng)頁或者文件的所在位置協(xié)議域名文件夾名稱文件名/storybooks/harry-potter.htmURL的格式主機名稱2、Java與Internet ——Java中的網(wǎng)絡通信

網(wǎng)絡應用是Java語言取得成功的領域之一,它已經(jīng)成為現(xiàn)在Internet上最流行的一種編程語言。Java語言在網(wǎng)絡編程方面提供了許多方便,其他語言往往需要數(shù)頁代碼才能完成的事情,在Java中可能只需要一條語句就可以。

Java的網(wǎng)絡通信分為三個層次:最高一級的網(wǎng)絡通信就是我們上一講中所涉及到的從網(wǎng)絡上下載Applet??蛻舳藶g覽器通過HTML文件中的<applet>標記來識別Applet,并解析Applet的屬性,通過網(wǎng)絡獲取Applet得字節(jié)碼文件。(由瀏覽器提供)上一講中所涉及到的聲音播放和圖象顯示,其中聲音文件和圖象文件的獲取是次一級的通信。通過類URL的對象指明文件所在位置,并從網(wǎng)絡上下載聲音和圖象文件。(由Java開發(fā)環(huán)境提供)最低一級的通信是利用包中提供的類直接在程序中實現(xiàn)網(wǎng)絡通信。(由Java語言開發(fā)包提供)2、Java與Internet ——Java中的網(wǎng)絡支持

針對網(wǎng)絡通信的不同層次,Java提供的網(wǎng)絡功能有四大類:URL、InetAddress、Sockets、Datagram。

URL面向的應用層,通過URL,Java程序可以直接送出或讀入網(wǎng)絡上的數(shù)據(jù)。InetAddress面向的是網(wǎng)絡層(IP層),用于標識網(wǎng)絡上的硬件資源。

Sockets和Datagram面向的則是傳輸層。Sockets使用的是TCP協(xié)議,這是傳統(tǒng)網(wǎng)絡程序最常用的方式,可以想象為兩個不同的程序通過網(wǎng)絡的通信信道進行通信。Datagram則使用UDP協(xié)議,是另一種網(wǎng)絡傳輸方式,它把數(shù)據(jù)的目的地紀錄在數(shù)據(jù)包中,然后直接放在網(wǎng)絡上。2、Java與Internet ——Java中的網(wǎng)絡支持包中的主要的類和可能產(chǎn)生的例外包括:面向IP層的類:InetAddress(Inet4Address,Inet6Address)面向應用層的類:URL、URLConnection面向網(wǎng)絡層的類:TCP協(xié)議相關類:Socket、ServerSocketUDP協(xié)議相關類:DatagramPacket、DatagramSocket、MulticastSocket可能產(chǎn)生的例外:BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException

類InetAddress可以用于標識網(wǎng)絡上的硬件資源(邏輯網(wǎng)絡中端),它提供了一系列方法以描述、獲取及使用網(wǎng)絡資源。

InetAddress類沒有構造函數(shù),因此不能用new來構造一個InetAddress實例。通常是用它提供的靜態(tài)方法來獲取:publicstaticInetAddressgetByName(String

host):host可以是一個機器名,也可以是一個形如“%d.%d.%d.%d”的IP地址或一個DSN域名。publicstaticInetAddressgetLocalHost()publicstaticInetAddress[]getAllByName(String

host)//多個網(wǎng)卡publicstaticInetAddressgetByAddress(String

host,Byte[]

addr)

這些方法通常會產(chǎn)生UnknownHostException例外,應在程序中捕獲處理。以下是InetAddress類的幾個主要方法,通過上述方法獲得InetAddress類的實例后就可以使用:publicbyte[]getAddress():獲得本對象的IP地址(存放在字節(jié)數(shù)組中)。publicStringgetHostAddress():獲得本對象的IP地址“%d.%d.%d.%d”。publicStringgetHostName():獲得本對象的機器名。3、使用InetAddress

下面的例子演示Java如何根據(jù)域名自動到DNS(域名服務器)上查找IP地址(與DNS服務器的連接減至一行):publicclassgetIP{publicstaticvoidmain(Stringargs[]){InetAddresspku=null;try{pku=InetAddress.getByName(“”);}catch(UnknownHostExceptione){}System.out.println(pku);}}3、使用InetAddressgetIP.java

通過InetAddress,可以獲取本機的IP地址:publicclassgetLocalHostTest{publicstaticvoidmain(){InetAddressmyIP=null;try{myIP=InetAddress.getLocalHost();}catch(UnknownHostExceptione){}System.out.println(myIP);}}3、使用InetAddressgetLocalHostTest.java4、使用URL ——在Java中構造URL

在包中,提供了類URL來表示URL。類URL提供了很多構造方法來生成一個URL對象:publicURL(String

spec)publicURL(URLcontext,Stringspec)publicURL(String

protocol,String

host,String

file)publicURL(String

protocol,String

host,int

port,String

file)

以下是一些具體的構造實例:URLurl1=newURL(“/map/index.html”);URLbase=newURL(“”);URLurl2=newURL(base,“mywork1.html”);URLurl3=newURL(base,“mywork2.html”);URLurl4=newURL(“http”,“”,“/~lyw/test.html”);URLurl5=newURL(“http”,“”,8080,“/java/network.html”);

另外還有兩種稍微復雜些的構造方法(參見JDK文檔)。

當創(chuàng)建URL時發(fā)生錯誤,系統(tǒng)會產(chǎn)生例外MalformedURLException,這是非運行時例外,必須在程序中捕獲處理。URLurl1,url2,url3;try{url1=newURL(“file:/D:/image/example.gif”);url2=newURL(“/map/”);url3=newURL(url2,“test.gif”);}catch(MalformedURLExceptione){DisplayErrorMessage();}4、使用URL ——在Java中構造URL

一個URL對象生成后,其屬性是不能被改變的(與String對象相似),但可以通過它給定的方法來獲取這些屬性:publicStringgetProtocol():獲取該URL的協(xié)議名publicStringgetHost():獲取該URL的主機名publicStringgetPort():獲取該URL的端口號publicStringgetPath():獲取該URL的文件路徑publicStringgetFile():獲取該URL的文件名publicStringgetRef():獲取該URL在文件中的相對位置publicStringgetQuery():獲取該URL的查詢名4、使用URL ——URL的基本方法ParseURL.java4、使用URL ——通過URL讀取www信息

通過URL類提供的方法openStream(),就可以讀取一個URL對象所指定的資源。publicfinalInputStream

openStream()

方法openStream()與指定的URL建立連接并返回一個InputStream對象,將URL位置的資源轉(zhuǎn)成一個輸入數(shù)據(jù)流。通過這個InputStream對象,就可以讀取資源中的數(shù)據(jù)。URLJava程序InputStream4、使用URL ——通過URL讀取www信息import.*;importjava.io.*;publicclassURLReader{publicstaticvoidmain(Stringargs[]){try{URLgis=newURL("/test.htm");BufferedReaderin=newBufferedReader(newInputStreamReader(gis.openStream()));Stringline;while((line=in.readLine())!=null){System.out.println(line);}in.close();}catch(Exceptione){System.out.println(e);}}}URLReader.java4、使用URL ——URL和InetAddress的聯(lián)合使用Applet中的網(wǎng)絡通信需要將URL和InetAddress聯(lián)合使用來得到相關的IP地址。

通過類Applet的getCodeBase()方法獲得提供它的主機的URL實例利用類URL的getHost()方法得到主機名利用類InetAddress的getByName()得到該主機的IP地址通過IP地址,就可以進行網(wǎng)絡通信(TCP,UDP)URLurl=getCodeBase();Stringhost=url.getHost();Try{InetAddressaddress=InetAddress.getByName(host);}catch(Exceptione){}Try{

DatagramSocketsocket=newDatagramSocket();DatagramPacketpacket=newDatagramPacket(buf,length,address,port);socket.send(packet);}catch(Exceptione){}AppletURLReader.java4、使用URL ——URL連接

通過URL類提供的方法openConnection(),就可以獲得一個URL連接(URLConnection)對象。publicURLConnection

openConnection()

通過URL的方法openStream(),只能從網(wǎng)絡上讀取資源中的數(shù)據(jù)。通過URLConnection類,可以在應用程序和URL資源之間進行交互,既可以從URL中讀取數(shù)據(jù),也可以向URL中發(fā)送數(shù)據(jù)。URLConnection類表示了應用程序和URL資源之間的通信連接。try{URLurl=newURL(“”);URLConnectionuc=url.openConnection();}catch(MalformedURLExceptione1){…}catch(IOExceptione2){…}4、使用URL ——URL連接publicclassURLConnectionReader{publicstaticvoidmain(Stringargs[]){try{URLgis=newURL("/test.htm");URLConnectionuc=gis.openConnection();BufferedReaderin=newBufferedReader(newInputStreamReader(uc.getInputStream()));Stringline;while((line=in.readLine())!=null){System.out.println(line);}in.close();}catch(Exceptione){System.out.println(e);}}}通過getInputStream()方法,應用程序就可以讀取資源中的數(shù)據(jù)。事實上,類URL的方法openStream()就是通過URLConnection類來實現(xiàn)的,它等價于:openConnection().getInputStream();URLConnection中最常用的兩個方法是:publicInputStream

getInputStream()publicOutputStream

getOutputStream()

URLConnectionReader.java

通過URLConnection對象獲取的輸入流和輸出流(不是所有的資源都可以獲得有效的輸出流),可以與現(xiàn)有的CGI程序進行交互。URL和URLConnection的區(qū)別在于前者代表一個資源的位置,后者代表一種連接。4、使用URL ——URL連接客戶端java程序OutputStreamInputStreamCGI程序STDINSTDOUT服務器connectiongetchar()putchar()URLurl=newURL("/~lyw/cgi-bin/test.cgi");URLConnectionuc=url.openConnection();uc.setDoOutput(true);PrintStreamout=newPrintStream(uc.getOutputStream());BufferedReaderin=newBufferedReader(newInputStreamReader(uc.getInputStream()));4、使用URL ——其他URL類

URLConnection類的其他方法以及其他URL相關的類(URLClassLoader,URLDecoder,URLEncoder,URLStreamHandler,HttpURLConnection,JarURLConnection,ContentHandler)的使用,大家在以后的實踐中去學習。第九章網(wǎng)絡通信網(wǎng)絡的基本概念Socket通信數(shù)據(jù)報高級語言程序設計(JAVA)第二節(jié)Socket通信網(wǎng)絡通信的基本原理Socket的定義Socket的應用掌握網(wǎng)絡通信的基本原理了解Socket通信的基本原理掌握Socket類的運用課程目標學習完本節(jié)課,您應該能夠:1、網(wǎng)絡通信的基本原理

計算機之間的通信是要遵循一定規(guī)則的,通信協(xié)議就是計算機之間進行通信所要遵循的各種規(guī)則的集合。網(wǎng)絡中的不同計算機之間要實現(xiàn)準確、迅速地傳遞信息,可以通過TCP/IP協(xié)議建立網(wǎng)絡上的兩臺計算機(程序)之間的可靠連接,并進行雙向通信。TCP/IP協(xié)議和OSI參考模型TCP/IP協(xié)議棧具有簡單的分層設計,與OSI參考模型有清晰的對應關系。TCP/IP應用層表示層會話層傳輸層網(wǎng)絡層數(shù)據(jù)鏈路層物理層1234567應用層傳輸層網(wǎng)絡層數(shù)據(jù)鏈路層物理層OSI參考模型TCP/IPTCP/IP協(xié)議棧應用層傳輸層網(wǎng)絡層數(shù)據(jù)鏈路層物理層提供應用程序網(wǎng)絡接口常見協(xié)議:HTTP、FTP、SMTP、DNS、TFTP……建立端到端連接常見協(xié)議:TCP、UDP尋址和路由選擇常見協(xié)議:IP(ICMP、ARP/RARP)物理介質(zhì)訪問常見協(xié)議:Ethernet、PPP、HDLC、FrameRelay、X.25……定義接口與線纜二進制數(shù)據(jù)流傳輸傳輸層協(xié)議應用層傳輸層網(wǎng)絡層數(shù)據(jù)鏈路層物理層TCP(TransmissionControlProtocol)UDP(UserDatagramProtocol)TCP協(xié)議TCP:TransferControlProtocol

面向連接的能夠提供可靠的流式數(shù)據(jù)傳輸?shù)膮f(xié)議。類似于打電話的過程。

URL,URLConnection,Socket,ServerSocket等類都使用TCP協(xié)議進行網(wǎng)絡通訊。UDP協(xié)議UDP是一個簡單的不可靠的數(shù)據(jù)報協(xié)議。非面向連接的提供不可靠的數(shù)據(jù)包式的數(shù)據(jù)傳輸?shù)膮f(xié)議。類似于從郵局發(fā)送信件的過程。

DatagramPacket,DatagramSocket,MulticastSocket等類使用UDP協(xié)議進行網(wǎng)絡通訊。UDP不提供可靠性:它把應用程序傳給IP層的數(shù)據(jù)發(fā)送出去,但是并不保證它們能到達目的地。TCP三次握手建立連接服務器主機SYN(seq=a)SYN(seq=b,ack=a+1)SYN(seq=a+1,ack=b+1)發(fā)送SYN接收SYN,發(fā)送SYN,ACK發(fā)送SYN,建立會話有連接的通信2、Socket通信所謂Socket通常也稱為”套接字”,由IP地址和端口號有兩部分組成,應用程序通過“套接字”向網(wǎng)絡發(fā)出請求或者應答網(wǎng)絡請求。portportSocket客戶機服務器1)什么是Socket?Socket請求響應

客戶機/服務器(C/S)模式是在網(wǎng)絡應用程序中最常用的通信模式。在C/S模式通信過程中主動發(fā)起通信的一方被稱為客戶機,而監(jiān)聽并接受請求進行通信的一方成為服務器。服務器使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,所以一般使用大于1024的端口),等待客戶端連接請求,客戶端連接后,會話產(chǎn)生,在完成會話后,關閉連接。2)客戶機/服務器(C/S)模式的原理C/S聊天室案例建立套接字Socket

在服務器端使用ServerSocket類,以等待客戶端的連接:ServerSocket(port);客戶端呼叫服務器等待在客戶端使用socket類,指定服務器IP和端口號,以便連到服務器上:Socket(host_IP,port);3)Socket的建立Socket主要方法在客戶端:建立socket連接后,還應該建立輸入輸出數(shù)據(jù)流。

getInputStream()獲得輸入流getOutputStream()獲得輸出流在服務器端:ServerSocket類的accept()方法使服務器處于阻塞狀態(tài),等待用戶請求。Socket通信Server端程序ServerSocket(port#)Socketsocket=ServerSocket.accept()接收連接OutputStreamInputStreamCloseSocketClient端程序Socket(host,port#)與服務器建立連接OutputStreamInputStreamCloseSocketsocketSocket通信

無論一個Socket通信程序的功能多么齊全、程序多么復雜,其基本結構都是一樣的,都包括以下四個基本步驟:1、在客戶方和服務器方創(chuàng)建Socket/ServerSocket實例。2、打開連接到Socket的輸入/輸出流。3、利用輸入/輸出流,按照一定的協(xié)議對Socket進行讀/寫操作。4、關閉輸入/輸出流和Socket。例1:演示服務器與客戶之間的交互,服務器等待,客戶訪問,相互通一次信息。

客戶端向服務器發(fā)出信息:“你好”,服務器接收到信息后,給出回應:“你好,我是服務器?!?、Socket的應用案例21.5Socket.21.5Socket創(chuàng)建服務器(端口號)定義數(shù)據(jù)成員服務器等待網(wǎng)絡連接建立socket流讀客戶端信息向用戶發(fā)出確認字符串創(chuàng)建Socket實例定義數(shù)據(jù)成員建立socket流讀socket流(接收并顯示)送用戶名給服務器關閉流waitingforuser43314331“這里是服務器"connetctingclient...你好提示用戶登錄成功讀socket流客戶機端importjava.io.*;import.*;classC{ publicstaticvoidmain(String[]args) { try{ Socketsocket=newSocket("",6565); DataOutputStreamout=newDataOutputStream(socket.getOutputStream());out.writeUTF("我是客戶機"); DataInputStreamin=newDataInputStream(socket.getInputStream());Strings=in.readUTF(); System.out.println("客戶機收到:"+s); }catch(Exceptione){} }}服務器端importjava.io.*;import.*;classS{ publicstaticvoidmain(String[]args) { try{ ServerSockets_socket=newServerSocket(6565); Socketsocket=s_socket.accept(); DataInputStreamin=newDataInputStream(socket.getInputStream());Strings=in.readUTF(); System.out.println("服務器收到:"+s); DataOutputStreamout=newDataOutputStream(socket.getOutputStream());out.writeUTF("我是服務器"); }catch(Exceptione){} }}21.5Socket顯示服務器與客戶機間的通信(服務器端)DataOutputStreamout=null;DataInputStreamin=null;ServerSockets_socket=null;Socketc_socket=null;Strings;//存放讀取到的信息try{s_socket=newServerSocket(4331);}catch(IOExceptione){}try{c_socket=s_socket.accept();

……}catch(IOExceptione){}創(chuàng)建服務器(端口號)定義數(shù)據(jù)成員服務器等待網(wǎng)絡連接用循環(huán)語句收發(fā)信息(見下頁)in=newDataInPutStream(clientSocket.getInputStream());out=newDataOutputStream(clientSocket.getOutputStream());創(chuàng)建服務器(端口號)定義數(shù)據(jù)成員服務器等待網(wǎng)絡連接建立socket流等待客戶登錄out.writeUTF(“這里是服務器");clientSocket.close();While(true){s=in.readUTF();if(s!=null)break;}讀客戶端信息創(chuàng)建Socket實例DataOutputStreamout=null;DataInputStreamin=null;Stringstring; Socketsocket=null;定義數(shù)據(jù)成員try{socket=newSocket("",4331);input=newDataInputStream(socket.getInputStream());output=newPrintStream(socket.getOutputStream());

建立socket流catch(IOExceptione){System.out.println(“無法連接”);}Out.writeUTF(“你好”);System.out.println(input.readLine());創(chuàng)建Socket實例定義數(shù)據(jù)成員建立socket流讀socket流(看到提示)從鍵盤上讀送用戶名送給服務器端關閉流mysocket.close();System.out.println(“s");讀服務器反饋While(true){s=in.readUTF();if(s!=null)break;}考慮多用戶第一種解決方案:一臺計算機上一次啟動多個服務器程序,只是端口號不同。myserver<-------->myclient----f21.batmyserver2<-------->myclient2----f9.batServer1(1111)client(2222)Server2(2222)client(1111)多用戶的第二種方案(支持多客戶)Serverclient1client2serverthreadserverthread將服務器寫成多線程的,不同的線程為不同的客戶服務.main()只負責循環(huán)等待線程負責網(wǎng)絡連接,接收客戶輸入的信息

客戶1客戶2服務器線程run()線程1()線程2()MySocketServer.javaclient()Run()Out.writeUTF()In.readUTF()客戶端writer.start()按鈕事件()socketgetInputStreamgetOutputStream服務器服務器端.服務器(4321)acceptsocket客戶IPclient1線程客戶IPclient2線程服務器一端為了能接收多個客戶的信息,它的輸入流,輸出流都是數(shù)組型的.ServerSocket.accept()等待用戶連接,一旦連接上,則調(diào)用服務程序.服務程序的主要內(nèi)容是網(wǎng)絡的讀寫,多客戶的原因,網(wǎng)絡讀寫的功能用多線程實現(xiàn),因此將此部分功能單獨分離出來,構成線程類服務器端client1client2serviceRequestserverServerSocketSocketgetOutputStreamgetInputStreamreader.runreader.runaccept()reader.start()read_net_inputwrite_net_output()作業(yè)編寫一個會話程序要求:會話雙方可以自由通話,看到對方發(fā)來“bye”則退出預習下節(jié)課內(nèi)容第三節(jié)基于數(shù)據(jù)報DatagramTCP/IP傳輸層由兩個并列的協(xié)議:TCP,UDP.UDP數(shù)據(jù)報的每個數(shù)據(jù)包要包含目的地址和端口號.socketserverclientDatagram數(shù)據(jù)報serverclient在UDP中,要使用二個類:(1)DatagramSocket類發(fā)送時,用send()方法發(fā)送數(shù)據(jù);接收時,用receive()方法接收數(shù)據(jù)。(2)DatagramPacket類用于打包或拆包發(fā)送時打包:包由數(shù)據(jù)、接收地址、端口號組成;接收時拆包:取出包中的數(shù)據(jù)、接收地址、端口號。Datagram工作過程建立數(shù)據(jù)報socket();建立一個報文包packet等待請求報文建立數(shù)據(jù)報socket建立一個請求包發(fā)出請求獲得對方地址構成信息包發(fā)送出去創(chuàng)建接收包等待接收Datagram一、服務器端發(fā)出報文的步驟如下:1.定義數(shù)據(jù)成員

DatagramSocketsocket;DatagramPacketpacket;InetAddressaddress;(用來存放接收方的地址)intport;;(用來存放接收方的端口號)2.創(chuàng)建數(shù)據(jù)報文Socket對象

try{socket=newDatagramSocket(1111);}catch(.SocketExceptione){}socket綁定到一個本地的可用端口,等待接收客戶的請求.Datagram3.分配并填寫數(shù)據(jù)緩沖區(qū)(一個字節(jié)類型的數(shù)組)byte[]Buf=newbyte[256];

存放從客戶端接收的請求信息.4.創(chuàng)建一個DatagramPacket

溫馨提示

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

評論

0/150

提交評論