實驗05 TCP Socket.doc_第1頁
實驗05 TCP Socket.doc_第2頁
實驗05 TCP Socket.doc_第3頁
實驗05 TCP Socket.doc_第4頁
實驗05 TCP Socket.doc_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

一本實驗目的及要求:1 掌握TCP/IP體系結構中端口、套接字、TCP協(xié)議概念。理解什么是SAP、端口的范圍劃分、套接字的組成等概念,掌握TCP傳輸模式和netstat命令的用途;2 掌握TCP SOCKET的ServerSocket和Socket;學習為TCP服務的 Socket和ServerSocket類的使用,掌握TCP連接的方法,服務器接收客戶端連接請求的方法,創(chuàng)建輸入/輸出流的方法,傳輸數(shù)據(jù)的方法,以及關閉流和套接字,注意可能會出現(xiàn)的異常操作;3 理解進程和線程的概念,掌握TCP SOCKET技術中多線程技術,理解JAVA中的動態(tài)數(shù)組的內容。4 實驗報告內容應包括,本實驗的第三、四、五部分的答案,以及第六部分的程序后要求。二、基礎知識1. TCP協(xié)議TCP是一種面向連接的、可靠的、基于字節(jié)流的運輸層(Transport layer)通信協(xié)議。在簡化的計算機網(wǎng)絡OSI模型中,它完成第四層傳輸層所指定的功能,UDP是同一層內另一個重要的傳輸協(xié)議。TCP所提供服務的主要特點:面向連接的傳輸;端到端的通信;高可靠性,確保傳輸數(shù)據(jù)的正確性,不出現(xiàn)丟失或亂序;全雙工方式傳輸;采用字節(jié)流方式,即以字節(jié)為單位傳輸字節(jié)序列;緊急數(shù)據(jù)傳送功能TCP支持的服務:文件傳送File Transfer;遠程登錄Remote login;計算機郵件Mail;網(wǎng)絡文件系統(tǒng)(NFS);遠程打印(Remote printing);遠程執(zhí)行(Remote execution);名字服務器(Name servers);終端服務器(Terminal servers)。 2. 端口TCP/IP協(xié)議中提出了端口(port)的概念,用于標識網(wǎng)絡主機上通信的軟件進程。 端口實際上是一個抽象的軟件結構(包括一些數(shù)據(jù)結構和I/O緩沖區(qū))。應用程序(即進程)通過系統(tǒng)調用與某端口建立關聯(lián)(binding)后,傳輸層傳給該端口的數(shù)據(jù)都被相應的應用進程所接收。端口又是在網(wǎng)絡體系結構中應用進程訪問傳輸服務的入口點SAP(Service Access Point服務訪問點)。在TCP/IP體系中,用于存儲端口號長度為16bit ,取值范圍065535,它用于存儲本地軟件進程,所以僅具有本地意義。通常,端口分為:熟知端口,取值范圍01023,為常用應用進程指定的固定值;一般端口,取值范圍102449151,供一般程序使用;動態(tài)端口:4915265535供某些默認服務使用,如表1所示。表1 常用進程和熟知端口echo7驗證2臺計算機連接有效性daytime13服務器當前時間文本描述ftp20/2121用于命令,20用戶數(shù)據(jù)telnet23遠程登錄smtp25郵件發(fā)送whois43網(wǎng)絡管理的目錄服務dns53域名解析tftp69小文件傳輸finger79主機用戶信息http80HTTPpop3110郵局協(xié)議nntp119網(wǎng)絡新聞傳輸協(xié)議, 發(fā)布Usenet新聞snmp161網(wǎng)絡管理協(xié)議rip520路由協(xié)議 3. 套接字套接字Socket原意是 “插座”,簡單的說就是參與通信兩方的一種約定,用套接字中的相關函數(shù)來完成通信過程。為了區(qū)分不同應用程序進程間的網(wǎng)絡通信和連接,主要使用3個參數(shù):通信的目的IP地址、使用的傳輸層協(xié)議(TCP或UDP)和使用的端口號,通過將這3個參數(shù)結合起來,與一個Socket綁定,應用層就可以和傳輸層通過套接字接口,區(qū)分來自不同應用程序進程或網(wǎng)絡連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務。通常的表示方式為:SOCKET=(傳輸協(xié)議,IP,Port)。 4 . NetstatNetStat是DOS命令,是一個監(jiān)控TCP/IP網(wǎng)絡的非常有用的工具,它可以顯示路由表、實際的網(wǎng)絡連接以及每一個網(wǎng)絡接口設備的狀態(tài)信息.Netstat用于顯示與IP、TCP、UDP和ICMP協(xié)議相關的統(tǒng)計數(shù)據(jù),一般用于檢驗本機各端口的網(wǎng)絡連接情況??梢酝ㄟ^執(zhí)行Netstat /help獲得該應用程序選項的相關幫助。在Java語言中,實現(xiàn)TCP 套接字中有兩個基礎類,分別為:l Socket類: 建立一個客戶端標識l ServerSocket類: 建立一個服務器端標識 5. ServerSocket該類實現(xiàn)服務器socket,一個服務器socket等待網(wǎng)絡上的連接請求。通常操作都是基于這個請求,并且會返回一個結果給請求連接者,其類描述如圖2所示。圖2 ServerSocket類描述ServerSocket構造方法有:ServerSocket() 創(chuàng)建一個空的服務端socket;ServerSocket(intport) 在指定端口創(chuàng)建一個服務端socket,;ServerSocket(intport, intbacklog) 在指定端口創(chuàng)建一個服務端socket和日志;ServerSocket(intport, intbacklog, InetAddressbindAddr) 在指定端口和地址上創(chuàng)建一個服務端socket和日志。 6. Socket該類實現(xiàn)一個客戶端socket,這個socket表示在通信的兩臺設備之間的端點,其類描述如圖3所示。圖3 Socket類描述Socket構造方法有:Socket() 創(chuàng)建一個空的客戶端socket;Socket(InetAddressaddress, intport) 創(chuàng)建一個連接指定遠程地址和端口的客戶端socket;Socket(InetAddressaddress, intport, InetAddresslocalAddr, intlocalPort) 在本地指定地址和端口,創(chuàng)建一個連接指定遠程地址和端口的客戶端socket;Socket(Stringhost, intport) 創(chuàng)建一個連接指定主機名稱和端口的客戶端socket;Socket(Stringhost, intport, InetAddresslocalAddr, intlocalPort) 在本地指定地址和端口,創(chuàng)建一個連接指定遠程主機名稱和端口的客戶端socket?;竟ぷ髟?,如圖4所示。1 啟動服務器端ServerSocket,監(jiān)聽指定端口;2 啟動客戶端Socket,連接服務器端Socket;3 服務器端Accept確認連接,建立通信通道;4 建立輸入和輸出流,進行通信;5 通信完畢,關閉Socket連接。7. 多線程(Thread)每個正在系統(tǒng)上運行的程序都是一個進程。每個進程包含一到多個線程。進程也可能是整個程序或者是部分程序的動態(tài)執(zhí)行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨立執(zhí)行。也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程序里執(zhí)行多任務。Java里面有2個方法實現(xiàn)多線程,不論哪種方法都需要覆蓋public void run()方法1 繼承 Thread類,比如class MyThread extends Thread public void run() / 這里寫上線程的內容 public static void main(String args) / 使用這個方法啟動一個線程 new MyThread().start(); 2 實現(xiàn) Runnable接口class MyThread implements Runnable public void run() / 這里寫上線程的內容 public static void main(String args) / 使用這個方法啟動一個線程 new Thread(new MyThread().start(); 一般鼓勵使用第二種方法,因為Java里面只允許單一繼承,但允許實現(xiàn)多個接口。第二個方法更加靈活。三類及方法:1. ServerSocket常用方法Socketaccept() 接受客戶端的連接請求;voidbind(SocketAddressendpoint) 綁定到指定的地址和端口;voidclose() 關閉該ServerSocket;InetAddressgetInetAddress() 獲得該ServerSocket的本地地址;intgetLocalPort() 獲得本地監(jiān)聽端口;intgetReceiveBufferSize() 獲得接收緩存尺寸;intgetSoTimeout() 獲得數(shù)據(jù)包超時時間;booleanisClosed()判斷ServerSocket是否關閉;voidsetReceiveBufferSize(intsize)設置接收緩存尺寸;voidsetSoTimeout(inttimeout) 以毫秒設置數(shù)據(jù)包超時時間;StringtoString() 將地址和端口作為字符串返回。2. Socket常用方法voidbind(SocketAddressbindpoint) 綁定socket在本地;voidclose() 關閉該socket;voidconnect(SocketAddressendpoint) 連接該socket到服務器上;voidconnect(SocketAddressendpoint, inttimeout) 連接該socket到服務器并設置超時時間;InetAddressgetInetAddress() 獲得該socket連接的地址;InputStreamgetInputStream() 獲得該 socket的輸入流;InetAddressgetLocalAddress() 獲得該socket的本地地址;intgetLocalPort()獲得該socket的本地端口;OutputStreamgetOutputStream()獲得該 socket的輸出流;intgetPort()獲得該 socket的遠端端口;intgetReceiveBufferSize() 獲得該Socket的接收緩存容量;intgetSendBufferSize()獲得該Socket的發(fā)送緩存容量;intgetSoTimeout() 獲得超時時間;booleanisClosed() 判斷該socket是否關閉;booleanisConnected() 判斷該socket是否連接;voidsetKeepAlive(booleanon) 設置該socket的連接狀態(tài);voidsetReceiveBufferSize(intsize) 設置接收緩存容量;voidsetSendBufferSize(intsize) 設置發(fā)送緩存容量;voidsetSoTimeout(inttimeout) 設置毫秒級的超時時間;StringtoString() 將該socket轉換為字符串輸出。三、基礎概念填空1. TCP是(一種面向連接的、可靠的、基于字節(jié)流的運輸層(Transport layer)通信協(xié)議 ), UDP是( TCP/IP 參考模型中傳輸層的無連接協(xié)議 ,提供面向事務的、簡單的、不可靠數(shù)據(jù)傳送服務 )。2. 端口是(網(wǎng)絡體系結構中應用層與傳輸層之間的通信協(xié)議接口 ),由( 16 )bit構成,表示范圍( 065535 ),其代表了( 存儲本地軟件)進程,且只具備本地意義。3. 套接字是(參與通信兩方的一種約定,用套接字中的相關函數(shù)來完成通信過程 ),其三個構成部分是( 通信的目的IP地址 )、( 使用的傳輸層協(xié)議(TCP或UDP) )和(使用的端口號 )。4. NetStat是(DOS命令,是一個監(jiān)控TCP/IP網(wǎng)絡的非常有用的工具,它可以顯示路由表、實際的網(wǎng)絡連接以及每一個網(wǎng)絡接口設備的狀態(tài)信息 ),要查看有效連接信息使用的參數(shù)是( -a ),要查看所有的連接信息使用的參數(shù)是( -n )。當發(fā)現(xiàn)連接的狀態(tài)是Listening表示( 某端口 是個開放的TCP端口,正處于監(jiān)聽狀態(tài),等待遠程用戶的連接 ),Established表示(表示已建立通信連接,兩臺機器正在交換數(shù)據(jù) )。5. 在JAVA中TCP的套接字類是( Socket )和(ServerSocket )。ServerSocket類的accept的作用是( 實現(xiàn)與客戶端的連接,完成TCP連接的三次握手 ),Socket類獲得輸入流的方法是(InputStream getInputStream() ),獲得輸出流的方法是(OutputStream getOutputStream() ).4、 程序填空1. 客戶端連接服務器端import java.io.* /引用輸入與輸出類庫import .* /引用網(wǎng)絡類庫public class exp_5_1 public static void main(String args) String hostName = ; int port = 80; Socket cs = null; try cs = new Socket (hostName, port); System.out.println(連接+hostName+的端口+port+成功); System.out.println(對方主機 + cs.getInetAddress() + :對方端口 + cs.getPort(); System.out.println(本地主機 + cs.getLocalAddress() + :本地端口 + cs.getLocalPort(); Cs. close (); catch(Exception e) System.err.println(無法連接指定服務); 2. 客戶端連接服務器端,并獲得輸入與輸出流import java.io.*;import .*;public class exp_5_3 public static void main(String args) throws IOException Socket cs = null; DataOutputStream os = null; DataInputStream is = null; try/建立socket連接 cs = new Socket (localhost, 8000);/發(fā)出連接請求 is = new DataInputStream(cs. getInputstream (); os = new DataOutputStream(cs. getOutputstream (); catch(UnknownHostException e) System.err.println(不可識別的主機); System.exit(0); catch(IOException e) System.err.println(無法鏈接到服務器的8000端口); System.exit(0); DataInputStream stdIn = new DataInputStream(System.in); System.out.print(請輸入你的用戶名:); String username = stdIn.readLine(); String fromServer, fromUser; while(fromServer = is.readUTF() != null) System.out.println(Server: + fromServer); if(fromServer.equals(bye) break; System.out.print(Client:); fromUser = stdIn.readLine(); os.writeUTF(username + # +fromUser); Os. flush (); os.close(); is.close(); stdIn.close(); cs.close(); 3. 服務器端程序import java.io.*;import .*;public class exp_5_4/TCP通信,作為服務器 public static void main(String args) throws IOException ServerSocket ss = null; try ss = new ServerSocket (8000); System.out.println(服務器開始監(jiān)聽8000端口的連接請求); catch(IOException e) System.err.println(8000端口不能使用); System.exit(1); Socket cs= null; try cs = ss. accept (); catch(IOException e) System.err.println(接受客戶機端連接失敗); System.exit(1); DataOutputStream os = new DataOutputStream(cs.getOutputStream(); DataInputStream is = new DataInputStream(cs. getInputStream() ); String inputStr, outputStr; /輸出操作 os.writeUTF(Welcome to My Chat Server); os.flush();/立即將數(shù)據(jù)從輸出緩存提交給網(wǎng)絡發(fā)送 DataInputStream stdIn = new DataInputStream( System.in ); /獲得鍵盤輸入流 /輸入操作 while(inputStr= is. readUTF() != null) /接受網(wǎng)絡數(shù)據(jù) System.out.println(Customer: + inputStr); System.out.print(Server:); outputStr = stdIn.readLine(); /接受鍵盤輸入 Os. writeUTF (outputStr); /向網(wǎng)絡發(fā)送數(shù)據(jù) os.flush(); if(outputStr.equals(bye) break; os.close();/流關閉 is.close(); cs.close();/套接字關閉 ss.close(); 五、實驗內容1在Windows下使用netstat命令,查看本地計算機開放端口。獲得/help,分別測試-s -e r -a n及其組合。2. 對指定IP范圍內主機上指定PORT范圍進行連接測試。 import .*; (2分)import java.io.*;class myJavapublic static void main(String args)String host = 222.24.16.; (2分) String host_ip = null;Socket cs = null;for(int i=1; i17; i+) (2分)host_ip = host + i;for(int j=0; j65536; j+) trycs = new Socket(host_ip, j); (2分)System.out.println(host_ip + : + j);catch(Exception e) (2分)System.err.println();報告內容:運行結果,獲得探測范圍中對主機開放端口數(shù)進行統(tǒng)計,并得到所消耗的總時間。利用RandomAccessFile將探測結果保存在文件中(IP地址和開放的端口號)2簡單的單線程,一問一答式通信的TCP Server和TCP Client,注意在編譯源代碼時有個提示“某API已經(jīng)過時”,找到該API類或者方法。在運行程序時,注意通信雙方是否隨時輸入,如果不能,考慮可能是什么原因造成的。/服務器端import java.io.*;import .*;public class SimpleServer/位置一public static void main(String args)/TCP通信,作為服務器ServerSocket serverSocket = null; /位置二/首先建立服務器try/端口號唯一標是本進程 /位置三serverSocket = new ServerSocket(10); /修改10為本地TCP已被占用的端口,或超過065535的端口,觀察結果System.out.println(Server is Listening on Port 10 Now);catch(IOException e)System.err.println(Cant listen on port 10);System.exit(1);/接受客戶端連接Socket clientSocket = null;tryclientSocket = serverSocket.accept(); /connectcatch(IOException e)System.err.println(Accept failed);System.exit(1);tryPrintStream out = new PrintStream(new BufferedOutputStream(clientSocket.getOutputStream(), 1024) ,false);DataInputStream in = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream();String inputLine, outputLine;/輸出操作out.println(Welcome to My Chat Server);out.flush();/立即將數(shù)據(jù)從輸出緩存提交給網(wǎng)絡發(fā)送 /接收鍵盤輸入 DataInputStream stdIn = new DataInputStream(System.in);/輸入操作while(inputLine = in.readLine() != null) /接受網(wǎng)絡數(shù)據(jù)System.out.println(Customer: + inputLine);System.out.print(Server:);outputLine = stdIn.readLine(); /接受鍵盤輸入/System.out.println(Server: + outputLine);out.println(outputLine); /向網(wǎng)絡發(fā)送數(shù)據(jù)out.flush();if(outputLine.equals(bye) break;out.close();/流關閉in.close();clientSocket.close();/套接字關閉serverSocket.close();catch(IOException e)System.err.println(Protocol Stream Error); /客戶端import java.io.*;import .*;public class MyClientpublic static void main(String args) throws IOExceptionSocket comSocket = null;PrintStream out = null;DataInputStream in = null;try/建立socket連接comSocket = new Socket(localhost, 1080);/相指定服務器的端口發(fā)出連接請求,注意服務器開放的TCP端口號 /分別對應服務器端的O/I流in = new DataInputStream(comSocket.getInputStream();out = new PrintStream(comSocket.getOutputStream();catch(UnknownHostException e)System.err.println(Cant find the Server host);System.exit(0);catch(IOException e)System.err.println(Cant get I/O for the Connection);System.exit(0);DataInputStream stdIn = new DataInputStream(System.in);String fromServer, fromUser;while(fromServer = in.readLine() != null)System.out.println(Server: + fromServer);if(fromServer.equals(bye) break;fromUser = stdIn.readLine();if(fromUser != null)System.out.println(Client: + fromUser);out.println(fromUser);out.close();in.close();stdIn.close();comSocket.close();注意:將位置二的語句分別放置到位置一和位置三,編譯看會出現(xiàn)什么問題,為什么會出現(xiàn)問題,該如何解決。答:不能。只能每次等對方輸入完才行,可能是因程序運行時占用同一通道,只能等對方不占用通道時才能執(zhí)行。將位置二的語句放到位置一時,位置三會報錯,因為此時serverSocket的作用范圍不在位置三內,應將serverSocket用static修飾;將位置二的語句放到位置三時,調用accept()方法的serverSocket會報錯,因為此時serverSocket的作用范圍被縮小在第一個try catch塊中,應該在第一個try catch塊的外面進行serverSocket的初始化。4以下代碼是個非常經(jīng)典的用戶自定義一問一答協(xié)議,在這里只需要修改服務器端程序即可,添加了GreetingProtocol.java(自定義協(xié)議),調試并修改協(xié)議使程序可以正常運行。/服務器端import java.io.*;import .*;public class MyServerpublic static void main(String args)/TCP通信,作為服務器ServerSocket serverSocket = null; /首先建立服務器tryserverSocket = new ServerSocket(1080);System.out.println(Server is Listening Now);catch(IOException e)System.err.println(Cant listen on port);System.exit(1);/接受客戶端連接Socket clientSocket = null;tryclientSocket = serverSocket.accept(); /connectcatch(IOException e)System.err.println(Accept failed);System.exit(1);tryPrintStream out = new PrintStream(new BufferedOutputStream(clientSocket.getOutputStream(), 1024) ,false);DataInputStream in = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream();String inputLine, outputLine; /自定義協(xié)議GreetingProtocol greeting = new GreetingProtocol();outputLine = cessInput(null);/輸出操作out.println(Welcome to My Chat Server);out.flush();/立即將數(shù)據(jù)從輸出緩存提交給網(wǎng)絡發(fā)送/輸入操作while(inputLine = in.readLine() != null)System.out.println(outputLine); /協(xié)議處理信息 outputLine = cessInput(inputLine); out.println(outputLine);out.flush();if(outputLine.equals(bye) break;out.close();/流關閉in.close();clientSocket.close();/套接字關閉serverSocket.close();catch(IOException e)System.err.println(Protocol Stream Error); /自定義協(xié)議public class GreetingProtocolprivate static final int WAITING = 0;private static final int SENDKNOCK = 1;private static final int SENDCLUE = 2;private static final int ANOTHER = 3;private static final int NUMJOKES = 5;private int state = WAITING;private int currentJoke = 0;private String clues = Turnip, Little Old Lady, Atch, Lamp, Godness;private String answers = Turnip the heat, its cold in here!,I did not know you could come!,Bless you,Lamp is bright,Godness is happy;public String processInput(String theInput)String theOutput = null;if(state = WAITING)theOutput = Knock! Knock!.;state = SENDKNOCK;else if( state = SENDKNOCK)if(theInput.equalsIgnoreCase(Whos there?)theOutput = cluescurrentJoke;state = SENDCLUE;elsetheOutput = You are supposed to say Whos there? ! Try again.;else if( state = SENDCLUE)if(theInput.equalsIgnoreCase(cluescurrentJoke + Who?)theOutput = answerscurrentJoke + Want another?(y/n);state = ANOTHER;elsetheOutput = You are supposed to say + cluescurrentJoke + Who? ! Try again. Knock! Knock!;state = SENDKNOCK;else if( state = ANOTHER)if(theInput.equalsIgnoreCase(y)theOutput = Knock! Knock!;if(currentJoke = (NUMJOKES - 1)currentJoke = 0;elsecurrentJoke +;state = SENDKNOCK;elsetheOutput = bye;state = WAITING;return theOutput;3探測目標計算機開放的TCP 端口import java.io.*;import .*;public class ScanPortpublic static void main(String args) throws IOExceptionSocket comSocket = null;for(int i=0;i1024; i+)try/建立socket連接comSocket = new Socket(localhost, i);/發(fā)出連接請求System.out.println(Can get I/O for the Connection, Port: + i);catch(UnknownHostException e)System.err.println(Cant find the Server host);/System.exit(0);catch(IOException e)System.err.println(Cant get I/O for the Connection, Port: + i);/System.exit(0);trycomSocket.close();catch(Exception e)思考:是否可以探測目標計算機的UDP端口4. TCP傳輸文件/采用TCP進行通訊,需要服務器和客戶端兩個部分,因此程序包含SendFileServer.java和SendFileClient.java兩個部分。兩個文件的IP,端口都在程序中指定, 傳輸?shù)奈募窂揭苍诔绦蛑兄付?SendFileServer.javaimport java.io.FileInputStream;import java.io.IOException;import java.io.OutputStream;import .ServerSocket;import .Socket;/* * 用TCP進行文件傳輸 * 此文件為服務器文件 * 當接受到客戶端的請求之后,先向其傳輸文件名 * 當客戶端接受完畢之后,向客戶端傳輸文件 * */public class SendFileServer implements Runnable/ 服務器監(jiān)聽端口private static final int MONITORPORT = 12345;private Socket s ;public SendFileServer(Socket s) super();this.s = s;public static void server()try / 創(chuàng)建服務器socketServerSocket ss = new ServerSocket(MONITORPORT);while(true)/ 接收到一個客戶端連接之后,創(chuàng)建一個新的線程進行服務/ 并將聯(lián)通的socket傳給該線程Socket s = ss.accept();new Thread(new SendFileServer(s

溫馨提示

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

評論

0/150

提交評論