計算機網(wǎng)絡(luò)課程設(shè)計--編程實現(xiàn)基于udp的ping_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  計算機網(wǎng)絡(luò)課程設(shè)計報告</p><p>  編程實現(xiàn)基于UDP的PING</p><p>  學 院 計算機學院 </p><p>  專 業(yè) </p><p><b>  學 號</b></p><p><b>  學生姓

2、名 </b></p><p>  指導教師 </p><p>  2017年 6月 </p><p><b>  計算機網(wǎng)絡(luò)課程設(shè)計</b></p><p><b>  程序開發(fā)的基礎(chǔ)知識</b></p><p><b

3、>  PING的相關(guān)知識</b></p><p>  Ping是Windows、Unix和Linux系統(tǒng)下的一個命令。ping也屬于一個通信協(xié)議,是TCP/IP協(xié)議的一部分。利用“ping”命令可以檢查網(wǎng)絡(luò)是否連通,可以很好地幫助我們分析和判定網(wǎng)絡(luò)故障。應(yīng)用格式:Ping空格IP地址。</p><p>  PING (Packet Internet Groper),因特網(wǎng)

4、包探索器,用于測試網(wǎng)絡(luò)連接量的程序。Ping發(fā)送一個ICMP(Internet Control Messages Protocol)即因特網(wǎng)信報控制協(xié)議;回聲請求消息給目的地并報告是否收到所希望的ICMPecho (ICMP回聲應(yīng)答)。它是用來檢查網(wǎng)絡(luò)是否通暢或者網(wǎng)絡(luò)連接速度的命令。作為一個生活在網(wǎng)絡(luò)上的管理員或者黑客來說,ping命令是第一個必須掌握的DOS命令,它所利用的原理是這樣的:利用網(wǎng)絡(luò)上機器IP地址的唯一性,給目標IP地址發(fā)

5、送一個數(shù)據(jù)包,再要求對方返回一個同樣大小的數(shù)據(jù)包來確定兩臺網(wǎng)絡(luò)機器是否連接相通,時延是多少。</p><p>  ping指的是端對端連通,通常用來作為可用性的檢查, 但是某些病毒木馬會強行大量遠程執(zhí)行ping命令搶占你的網(wǎng)絡(luò)資源,導致系統(tǒng)變慢,網(wǎng)速變慢。嚴禁ping入侵作為大多數(shù)防火墻的一個基本功能提供給用戶進行選擇。通常的情況下你如果不用作服務(wù)器或者進行網(wǎng)絡(luò)測試,可以放心的選中它,保護你的電腦。</p&

6、gt;<p><b>  UDP的相關(guān)知識</b></p><p>  UDP 是User Datagram Protocol的簡稱,全稱是用戶數(shù)據(jù)報協(xié)議  ,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無連接的協(xié)議。在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層。UDP有不提供數(shù)據(jù)包分組、組裝和不能對數(shù)據(jù)包進行排序的缺點,也就是說,當報文發(fā)送

7、之后,是無法得知其是否安全完整到達的。UDP用來支持那些需要在計算機之間傳輸數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用。包括網(wǎng)絡(luò)視頻會議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都需要使用UDP協(xié)議。UDP協(xié)議從問世至今已經(jīng)被使用了很多年,雖然其最初的光彩已經(jīng)被一些類似協(xié)議所掩蓋,但是即使是在今天UDP仍然不失為一項非常實用和可行的網(wǎng)絡(luò)傳輸層協(xié)議。</p><p>  與所熟知的TCP(傳輸控制協(xié)議)協(xié)議一樣,UDP協(xié)議直接位于IP(網(wǎng)際協(xié)

8、議)協(xié)議的頂層。根據(jù)OSI(開放系統(tǒng)互連)參考模型,UDP和TCP都屬于傳輸層協(xié)議。UDP協(xié)議的主要作用是將網(wǎng)絡(luò)數(shù)據(jù)流量壓縮成數(shù)據(jù)包的形式。一個典型的數(shù)據(jù)包就是一個二進制數(shù)據(jù)的傳輸單位。每一個數(shù)據(jù)包的前8個字節(jié)用來包含報頭信息,剩余字節(jié)則用來包含具體的傳輸數(shù)據(jù)。</p><p>  Socket通信機制相關(guān)知識</p><p>  網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個

9、連接的一端稱為一個socket。</p><p>  建立網(wǎng)絡(luò)通信連接至少要一對端口號(socket)。socket本質(zhì)是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動機,提供了網(wǎng)絡(luò)通信的能力。</p><p>  Socket的英文原義是“孔”或

10、“插座”。作為BSD UNIX的進程通信機制,取后一種意思。通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄,可以用來實現(xiàn)不同虛擬機或不同計算機之間的通信。在Internet上的主機一般運行了多個服務(wù)軟件,同時提供幾種服務(wù)。每種服務(wù)都打開一個Socket,并綁定到一個端口上,不同的端口對應(yīng)于不同的服務(wù)。Socket正如其英文原意那樣,像一個多孔插座。一臺主機猶如布滿各種插座的房間,每個插座有一個編號,

11、有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節(jié)目。 客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務(wù)。</p><p><b>  設(shè)計思路</b></p><p>  本程序是通過基于UDP的socket的網(wǎng)絡(luò)編程,來實現(xiàn)客戶端和服務(wù)器端的信息傳輸,包括客戶端發(fā)送請求給服務(wù)器端、服務(wù)器端回應(yīng)客戶端,以致實現(xiàn)PING的效果。</

12、p><p>  具體的思路是通過調(diào)用java JDK中java.net包下的DatagramSocket和DatagramPacket類,可以實現(xiàn)對用戶數(shù)據(jù)報文的控制,DatagramSocket類用于創(chuàng)建接收和發(fā)送UDP的Socket實例,調(diào)用DatagramPacket類用于處理報文,因為它可以將Byte數(shù)組、目標地址、目標端口等數(shù)據(jù)包裝成報文或者將報文拆卸成Byte數(shù)組。這樣就可以實現(xiàn)客戶端和服務(wù)器端的信息交流

13、了。以此來達到ping的功能。</p><p>  再通過多線程編程的思想,讓不同客戶端的請求運行在不同的線程,來實現(xiàn)服務(wù)器端為多個客戶端服務(wù)的功能。</p><p><b>  程序流程圖</b></p><p><b>  四.關(guān)鍵數(shù)據(jù)結(jié)構(gòu)</b></p><p>  本程序主要用到的數(shù)據(jù)結(jié)構(gòu)有

14、以下:</p><p>  1.Math.random() * 1000,獲取隨機數(shù)字</p><p>  2.for (int i = 0; i < 10; i++)</p><p>  {if (rtt[i] > maxRtt){maxRtt = rtt[i];}</p><p>  if(rtt[i]!=0){if (rt

15、t[i] < minRtt){minRtt = rtt[i];}</p><p>  }sumRtt += rtt[i]; },通過循環(huán)獲取極值。</p><p><b>  五.關(guān)鍵性的代碼</b></p><p>  1.客戶端發(fā)送請求和接收回復(fù)</p><p>  DatagramSocket client

16、Socket = new DatagramSocket();//生成client端socket實例</p><p>  InetAddress IPAddress = InetAddress.getByName(address); //生成ip地址實例</p><p>  byte[] sendData = new byte[1024]; //用于接收數(shù)據(jù)的byte數(shù)組</p>

17、;<p>  byte[] receiveData = new byte[1024];//用于發(fā)送數(shù)據(jù)的byte數(shù)組</p><p>  sendData = sentence.getBytes();</p><p>  DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, I

18、PAddress, port);//生成發(fā)送數(shù)據(jù)包</p><p>  Date sendBefore = new Date();//發(fā)送前時</p><p>  clientSocket.send(sendPacket); //發(fā)送</p><p>  DatagramPacket receivePacket = new DatagramPacke

19、t(receiveData,receiveData.length);//生成接收數(shù)據(jù)包</p><p>  clientSocket.receive(receivePacket); //接收從server返回的數(shù)據(jù)包</p><p>  Date receiveAfter = new Date(); //接收后的時間 </p><p>  

20、//最多等待1秒以便接收PingServer返回的reply消息。如果在該時間內(nèi)沒有收到服務(wù)器的reply,則認為該請求或?qū)υ撜埱蟮膔eply已經(jīng)丟失</p><p>  String modifiedSentence = "";</p><p>  if(receiveAfter.getTime() - sendBefore.getTime()>1000){&l

21、t;/p><p>  modifiedSentence = "請求超過1秒,模擬數(shù)據(jù)丟失?。n";</p><p>  rtt[i-1]=(long)0; //當收不到reply時,置折返時間為0,不加入計算</p><p>  }else{modifiedSentence = new String(receivePacket.getData()

22、);</p><p>  rtt[i - 1] = receiveAfter.getTime() - sendBefore.getTime();</p><p><b>  }</b></p><p>  2.服務(wù)器端接收請求和回復(fù)客戶端</p><p>  new Thread(){@Override</p>

23、;<p>  public void run() {</p><p>  int cilentCount = 0; //客戶端的數(shù)量(多個客戶端)</p><p>  //服務(wù)器端一直處于接收狀態(tài)</p><p>  while (true){</p><p>  byte[] sendData = new byte[1024]

24、;</p><p>  DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);//生成接收數(shù)據(jù)報包實例</p><p>  try {serverSocket.receive(receivePacket);} catch (Exception e) {e.printStackTr

25、ace();} //從客戶端接收到請求</p><p>  String sentence = new String(receivePacket.getData());</p><p>  InetAddress IPAddress = receivePacket.getAddress(); //獲得client端的ip</p><p> 

26、 int port = receivePacket.getPort(); //獲得client端的port</p><p>  long randomTime = (long) (Math.random() * 1000); //生成隨機數(shù),用于模擬傳輸延遲</p><p>  try {Thread.sleep(random

27、Time);} catch (InterruptedException e) {e.printStackTrace();} //程度睡眠,用于模擬傳輸延遲</p><p>  if(sentence.substring(7,8).equals("1")&&!sentence.substring(7,9).equals("10")){</p

28、><p>  cilentCount++; System.out.println("***********************************************");</p><p>  System.out.println("* 第 "+cilentCount+" 臺客戶端機正在請求?。。。?! *&qu

29、ot;);</p><p>  System.out.println("***********************************************\n");</p><p>  }System.out.println("從客戶端接收到的信息為:");</p><p>  System.out.println

30、("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");</p><p>  System.out.println(sentence);sendData = sentence.getBytes(); </p><p>  DatagramPa

31、cket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); //生成數(shù)據(jù)包</p><p>  try {serverSocket.send(sendPacket);} catch (Exception e) {e.printStackTrace();} //發(fā)回client端}</p&g

32、t;<p>  }.start();</p><p>  六.開發(fā)過程中遇到的問題及解決辦法</p><p>  1. 問題:在編寫程序的過程中,因為對socket編程不了解,導致不能正確讓客戶端和服務(wù)器端相互發(fā)送消息。</p><p>  解決:網(wǎng)上查詢socket相關(guān)的編程知識,調(diào)用java JDK中java.net包下的DatagramSocke

33、t和DatagramPacket類,實現(xiàn)客戶端和服務(wù)器端的信息交流。</p><p>  2.問題:剛開始編程時,服務(wù)器端不能服務(wù)多個客戶端。</p><p>  解決:通過多線程編程,使不同客戶端的請求運行在不同的線程,來實現(xiàn)服務(wù)器端對多個客戶端的請求服務(wù)。</p><p>  七.程序中待解決的問題及改進方向</p><p>  1.待解

34、決的問題:程序界面不過人性化。</p><p>  改進方向:繼續(xù)深入優(yōu)化</p><p><b>  八.程序測試結(jié)果</b></p><p><b>  客戶端請求</b></p><p><b>  服務(wù)器端回復(fù)</b></p><p><b

35、>  以下為完整代碼</b></p><p><b>  客戶端代碼</b></p><p>  import java.io.BufferedReader;</p><p>  import java.io.InputStreamReader;</p><p>  import java.io.Str

36、ingReader;</p><p>  import java.net.DatagramPacket;</p><p>  import java.net.DatagramSocket;</p><p>  import java.net.InetAddress;</p><p>  import java.text.SimpleDateF

37、ormat;</p><p>  import java.util.Date;</p><p>  /*PingClient,客戶端,有以下功能</p><p>  3.1啟動后發(fā)送10個request。發(fā)送一個request后,最多等待1秒以便接收PingServer返回的reply消息。</p><p>  如果在該時間內(nèi)沒有收到服務(wù)器的

38、reply,則認為該請求或?qū)υ撜埱蟮膔eply已經(jīng)丟失;在收到reply后立即發(fā)送下一個request。</p><p>  3.2請求消息的payload中至少包含關(guān)鍵字PingUDP、序號、時間戳等內(nèi)容。如:PingUDP SequenceNumber TimeStamp CRLF</p><p>  其中:CRLF表示回車換行符(0X0D0A);TimeStamp為發(fā)送該消息的機器時

39、間。</p><p>  3.3為每個請求計算折返時間(RTT),統(tǒng)計10個請求的平均RTT、最大/小RTT。</p><p>  3.4通過如下命令行啟動:java PingClient host port。</p><p>  host為PingServer所在的主機地址;port為PingServer的工作端口號</p><p><

40、;b>  */</b></p><p>  public class PingClient</p><p><b>  {</b></p><p>  public static void main(String[] args) throws Exception</p><p><b>  {

41、</b></p><p>  String address = args[0]; //從命令行獲得server ip地址</p><p>  int port = new Integer(args[1]);

42、 //從命令行獲得端口號</p><p>  long[] rtt = new long[10]; //用于折返時間的統(tǒng)計</p><p>  System.out.println("\n客戶端啟動,開始發(fā)送請求!!?。n\n\n");</p><p> 

43、 for (int i = 1; i <= 10; i++) //發(fā)送10條請求</p><p><b>  {</b></p><p>  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd h

44、h:mm:ss.SS"); //時間戳格式</p><p>  String sentence = "頭部: 請求 " + i + " \n"//請求數(shù)據(jù)</p><p>  + "payload:PingUDP 序號:" + i + " 時間戳:"</p>

45、<p>  + sdf.format(new Date())+"\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";</p><p>  DatagramSocket clientSocket = new DatagramSocket(); //生成client端socket實例</p>

46、<p>  InetAddress IPAddress = InetAddress.getByName(address); //生成ip地址實例</p><p>  byte[] sendData = new byte[1024]; //用于接收數(shù)據(jù)的byte數(shù)組</p><p>  byte[

47、] receiveData = new byte[1024]; //用于發(fā)送數(shù)據(jù)的byte數(shù)組</p><p>  sendData = sentence.getBytes();</p><p>  DatagramPacket sendPacket = new DatagramPacket(sendData, sen

48、dData.length, IPAddress, port);//生成發(fā)送數(shù)據(jù)包</p><p>  Date sendBefore = new Date(); //發(fā)送前時間</p><p>  clientSocket.send(sendPacket);

49、 //發(fā)送</p><p>  DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);//生成接收數(shù)據(jù)包</p><p>  clientSocket.receive(re

50、ceivePacket); //接收從server返回的數(shù)據(jù)包</p><p>  Date receiveAfter = new Date(); //接收后的時間 <

51、;/p><p>  //最多等待1秒以便接收PingServer返回的reply消息。如果在該時間內(nèi)沒有收到服務(wù)器的reply,則認為該請求或?qū)υ撜埱蟮膔eply已經(jīng)丟失</p><p>  String modifiedSentence = "";</p><p>  if(receiveAfter.getTime() - sendBefore.g

52、etTime()>1000){</p><p>  modifiedSentence = "請求 "+i+" 超過1秒,模擬數(shù)據(jù)丟失?。?quot;;</p><p>  rtt[i - 1] = (long) 0;

53、 //當收不到reply時,置折返時間為0,不加入計算</p><p><b>  }else{</b></p><p>  modifiedSentence = new String(receivePacket.getData());</p><p>  rtt[i - 1] = receiveAfter.getTime() - sen

54、dBefore.getTime();</p><p><b>  }</b></p><p>  System.out.println("折返時間和服務(wù)端的返回信息為:");</p><p>  System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

55、@@@@@@@@@@@@@@@");</p><p>  System.out.println("折返時間(RTT):" + rtt[i - 1]);</p><p>  System.out.println(modifiedSentence); //顯示從server返

56、回的數(shù)據(jù)</p><p>  if(rtt[i - 1]==0){</p><p>  System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n\n\n\n\n\n");</p><p><b>  }</b></p>

57、<p>  clientSocket.close(); //關(guān)閉socket</p><p><b>  }</b></p><p>  //統(tǒng)計出平均rtt,最大rtt和最小rtt</p><p>  

58、long sumRtt = 0;</p><p>  long maxRtt = 0;</p><p>  long k = 0;</p><p>  long minRtt = rtt[0];</p><p>  int j = 0;</p><p>  for (int i = 0; i < 10; i++)

59、</p><p><b>  { </b></p><p>  if(rtt[i] > k){</p><p>  if (rtt[i] > maxRtt)</p><p><b>  {</b></p><p>  maxRtt = rtt[i];</

60、p><p><b>  }</b></p><p>  if (rtt[i] < minRtt)</p><p><b>  {</b></p><p>  minRtt = rtt[i];</p><p><b>  }</b></p>

61、<p><b>  j++;</b></p><p>  sumRtt += rtt[i];}</p><p><b>  }</b></p><p>  System.out.println("最終折返時間為:"); </p><p>  System.out.pr

62、intln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");</p><p>  System.out.println("平均折返時間: " + sumRtt / j +"ms");</p><p>  System.out.println("最大折返時間

63、: " + maxRtt+"ms");</p><p>  System.out.println("最小折返時間: " + minRtt+"ms");</p><p>  System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

64、@@@");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  服務(wù)端代碼</b></p><p>  import java.io.BufferedReader;</p><p>  

65、import java.io.InputStreamReader;</p><p>  import java.net.DatagramPacket;</p><p>  import java.net.DatagramSocket;</p><p>  import java.net.InetAddress;</p><p><b&g

66、t;  /**</b></p><p>  * Ping Server服務(wù)器端,完成以下功能</p><p>  * 2.1 可以并發(fā)地為多個用戶服務(wù);</p><p>  2.2 顯示用戶通過客戶端發(fā)送來的消息內(nèi)容(包含頭部和payload);</p><p>  2.3 能夠模擬分組的丟失;能夠模擬分組傳輸延遲;</p&

67、gt;<p>  2.4 將用戶發(fā)送來的請求request在延遲一段隨機選擇的時間(小于1s)后返回給客戶端,作為收到請求的響應(yīng)reply;</p><p>  2.5 通過如下命令行啟動服務(wù)器:java PingServer port。</p><p>  port為PingServer的工作端口號</p><p><b>  */<

68、/b></p><p>  public class PingServer</p><p><b>  {</b></p><p>  public static void main(String[] args) throws Exception</p><p><b>  {</b><

69、/p><p>  System.out.println("\n服務(wù)端啟動,等待客戶端請求.......\n\n\n");</p><p>  int initPort = new Integer(args[0]); //從命令行獲得port args[0]</p><p>  DatagramSocket serverSocket

70、= new DatagramSocket(initPort); //根據(jù)port,生成server端socket實例</p><p>  byte[] receiveData = new byte[1024];</p><p><b>  /*</b></p><p>  * 使用多線程編程,可以實現(xiàn)多個客戶端同時請求服務(wù)端<

71、/p><p><b>  */</b></p><p>  new Thread(){</p><p><b>  @Override</b></p><p>  public void run() {</p><p>  int cilentCount = 0; //客戶端的數(shù)

72、量(多個客戶端)</p><p>  //服務(wù)器端一直處于接收狀態(tài)</p><p>  while (true)</p><p><b>  {</b></p><p>  byte[] sendData = new byte[1024];</p><p>  DatagramPacket rec

73、eivePacket = new DatagramPacket(receiveData, receiveData.length);//生成接收數(shù)據(jù)報包實例</p><p>  try {serverSocket.receive(receivePacket);} catch (Exception e) {e.printStackTrace();} //從客戶端接收到請求</p>

74、<p>  String sentence = new String(receivePacket.getData());</p><p>  InetAddress IPAddress = receivePacket.getAddress(); //獲得client端的ip</p><p>  int port

75、 = receivePacket.getPort(); //獲得client端的port</p><p>  long randomTime = (long) (Math.random() * 1000); //生成隨機數(shù),用于模擬傳輸延遲</p><p> 

76、 try {Thread.sleep(randomTime);} catch (InterruptedException e) {e.printStackTrace();} //程度睡眠,用于模擬傳輸延遲</p><p>  if(sentence.substring(7,8).equals("1")&&!sentence.substring(7,9).equal

77、s("10")){</p><p>  cilentCount++;</p><p>  System.out.println("***********************************************");</p><p>  System.out.println("* 第 &q

78、uot;+cilentCount+" 臺客戶端機正在請求?。。。?! *");</p><p>  System.out.println("***********************************************\n");</p><p><b>  }</b></p><p>

79、  System.out.println("從客戶端接收到的信息為:");</p><p>  System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");</p><p>  System.out.println(sentence);</p>

80、<p>  sendData = sentence.getBytes(); </p><p>  DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); //生成數(shù)據(jù)包</p>

81、<p>  try {serverSocket.send(sendPacket);} catch (Exception e) {e.printStackTrace();} //發(fā)回client端</p><p><b>  }</b></p><p><b>  }</b></p><p>  }

溫馨提示

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

評論

0/150

提交評論