版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、計算機網(wǎng)絡課程設計學院計算機學院專業(yè)軟件工程年級班別忸4班學 號 3112006291學生姓名 林炳城指導教師梁路成 績目錄一、設計環(huán)境4二、課程設計的目的 4三、理論基礎4四、基本要求5五、設計思想6六、源程序7七、測試用例1.3八、總結1.7.九、附帶半成品作業(yè)截圖 18.計算機網(wǎng)絡課程設計任務書設計題目編程實現(xiàn)基于 UDP的PING (Java)1.編程實現(xiàn)PING的服務器端和客戶端,實現(xiàn)操作系統(tǒng)提供的ping命令的類似功能。2.服務器端PingServer功能:2.1可以2.2顯示用戶通 過客戶 端發(fā) 送來的消息 內容(包含頭 部和payload);2.3能夠模擬分組的丟失;能夠模擬分
2、組傳輸延遲;2.4將用戶發(fā)送來的請求request在延遲一段隨機選擇的時間(小于1s)后返回給客戶端,作為收到請求的響應reply ;2.5通過如下命令行啟動服務器:java PingServer port 。port為PingServer的工作端口號已知技術參3.客戶端PingClient功能:3.1 啟動后發(fā)送10個request。發(fā)送一個request后,最多等待1秒以便接必科反U要 求收PingServer返回的reply消息。如果在該時間內沒有收到服務器的 reply ,則認為該請求或對該請求的reply已經(jīng)丟失;在收到reply后立.即發(fā)送下一個request。3.2請求消息的pa
3、yload中至少包含關鍵字 PingUDP、序號、時間戳等內容。如:PingUDP SequenceNumber TimeStamp CRLF其中:CRLF表示回車換行符(0X0D0A); TimeStamp為發(fā)送該消息的機器時間。3.3為每個請求計算折返時間(RTT),統(tǒng)計10個請求的平均 RTT、最大/小RII。3.4通過如下命令行啟動:java PingClient host port 。host為PingServer所在的主機地址;port為PingServer的工作端口號1.學習ICMP, 了解ping命令的工作機理;2.學習Java UDP Socket通信機制;設計內容與3.了解
4、Java多線程程序設計;步驟4.服務器PingServer程序設計;5.客戶端PingClient程序設計。6.調試與演示1.ping命令工作機制學習2小時2.Java UDP Socket通信機制2小時設計工作計3.Java多線程程序設計4小時4.PingServer程序設計6小時劃與進度安5.PingClient程序設計12小排時6.調試與演示4小時6.課程設計說明書10小時、設計環(huán)境操作系統(tǒng):win8開發(fā)環(huán)境:JDK1.7 IDE: eclipse二、課程設計的目的本次課程設計的目的在掌握計算機網(wǎng)絡理論的基礎上,了解網(wǎng)絡技術,掌 握計算機網(wǎng)絡相關設計方法和思想, 希望能通過本次的課程設計
5、,達到鞏固和綜 合應用計算機網(wǎng)絡原理和知識,本次課程設計主要是編程實現(xiàn)基于 UDP的ping , 使用java語言編程,編寫一個實驗程序、仿真模擬 Ping命令,通過觀察實驗結 果,從而判定本次程序設計是否成功完成任務。三、理論基礎3.1 UDP簡介UDP是User Datagram Protocol的簡稱, 中文名是用戶數(shù)據(jù)包協(xié)議,是 OSI (Open System Interconnection ,開放式系統(tǒng)互聯(lián))參考模型中一種無連接的傳輸層協(xié)議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768是UDP的正式規(guī)范。UDP在IP報文的協(xié)議號是17。UDP協(xié)議全稱是用戶數(shù)據(jù)報協(xié)
6、議 1,在網(wǎng)絡中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無連接的協(xié)議。在 OSI模型中,在第四層 傳輸層,處于IP協(xié)議的上一層。UDP有 不提供數(shù)據(jù)包分組、 組裝和不能對數(shù)據(jù)包進行排序的缺點,也就是說,當報文發(fā)送之后,是無法得知其是否安全完整到達的。UDP用來支持那些需要在計算機之間傳輸數(shù)據(jù)的網(wǎng)絡應用。包括網(wǎng)絡視頻會議系統(tǒng)在內的眾多的客戶/服務器模式的網(wǎng)絡應用都需要使用UDP協(xié)議。UDP協(xié)議從問世至今已經(jīng)被使用了很多年,雖然其最初的光彩已經(jīng)被一些類似協(xié)議所掩蓋, 但是即使是在今天 UDP仍然不失為一項非常實用和可行的網(wǎng)絡傳輸層協(xié)議。與所熟知的TCP (傳輸控制協(xié)議)協(xié)議一樣,UDP協(xié)議直接位于
7、IP (網(wǎng)際協(xié)議)協(xié)議的頂層。根據(jù) OSI (開放系統(tǒng)互連)參考模型,UDP和TCP都屬于傳輸層協(xié)議。UDP協(xié)議的主要作用是將網(wǎng)絡數(shù)據(jù)流量壓縮成數(shù)據(jù)包的形式。一個典型的數(shù)據(jù)包就是一個二進制數(shù)據(jù)的傳輸單位。每一個數(shù)據(jù)包的前8個字節(jié)用來包含報頭信息,剩余字節(jié)則用來包含具體的傳輸數(shù)據(jù)。3.2 ping 簡介Ping是 Windows下的一個命令在 Unix和Linux下也有這個命令。ping也屬于一個通信 協(xié)議,是TCP/IP協(xié)議的一部分。利用ping ”命令可以檢查網(wǎng)絡是否連通,可以很好地幫助我們分析和判定網(wǎng)絡故障。應用格式:Ping空格IP地址。該命令還可以加許多參數(shù)使用,具體是鍵入Ping按回
8、車即可看到詳細說明。PING (Packet Internet Groper),因特網(wǎng)包探索器,用于測試網(wǎng)絡連接量的程序。Ping發(fā)送一個ICMP(Internet Control Messages Protocol )即因特網(wǎng)信報控制協(xié)議;回聲請求消息給目的地并報告是否收到所希望的ICMP echo (ICMP回聲應答)。它是用來檢查網(wǎng)絡是否通暢或者網(wǎng)絡連接速度的命令。作為一個生活在網(wǎng)絡上的管理員或者黑客來說,ping命令是第一個必須掌握的 DOS命令,它所利用的原理是這樣的:利用網(wǎng)絡上機器IP地址的唯一性,給目標IP地址發(fā)送一個數(shù)據(jù)包,再要求對方返回一個同樣大小的數(shù)據(jù)包來確定兩臺網(wǎng)絡機 器
9、是否連接相通,時延是多少。ping指的是端對端連通,通常用來作為可用性的檢查,但是某些病毒木馬會強行大量遠程執(zhí)行ping命令搶占你的網(wǎng)絡資源,導致系統(tǒng)變慢,網(wǎng)速變慢。嚴禁 ping入侵作為大多 數(shù)防火墻的一個基本功能提供給用戶進行選擇。通常的情況下你如果不用作服務器或者進行網(wǎng)絡測試,可以放心的選中它,保護你的電腦。四、基本要求4.1 編程實現(xiàn)PING的服務器端和客戶端,實現(xiàn)操作系統(tǒng)提供的ping命令的類似功能。4.2 服務器端 PingServer功能:4.2.1 可以2.2顯示用戶通過客戶端發(fā)送來的消息內容(包含頭部和payload);4.2.3 能夠模擬分組的丟失;能夠模擬分組傳輸延遲;4
10、.2.4 將用戶發(fā)送來的請求request在延遲一段隨機選擇的時間(小于1s)后返回給客戶端作為收到請求的響應reply ;4.2.5 通過如下命令行啟動服務器:java PingServer port 。port為PingServer的工作端口號4.3 客戶端PingClient功能:4.3.1 啟動后發(fā)送10個request。發(fā)送一個request后,最多等待1秒以便接收 PingServer返回的reply消息。如果在該時間內沒有收到服務器的reply ,則認為該請求或對該請求的reply已經(jīng)丟失;在收到reply后立即發(fā)送下一個request。4.3.2 請求消息的payload中至少
11、包含關鍵字 PingUDP、序號、時間戳等內容。如: PingUDP SequenceNumber TimeStamp CRLF 其中:CRLF表示回車換行符 (0X0D0A); TimeStamp為發(fā)送該消息的機器時間。4.3.3 為每個請求計算折返時間(RTT),統(tǒng)計10個請求的平均 RTT、最大/小RTT。4.3.4 通過如下命令行啟動:java PingClient host port 。host為PingServer所在的主機地址 port為PingServer的工作端口號五、設計思想UDP協(xié)議的全稱是用戶數(shù)據(jù)報,在網(wǎng)絡中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,在OSI模型中,在第四層-傳
12、輸層,處于IP協(xié)議的上一層,UDP有不提供數(shù)據(jù)報分組、 組裝和不能對數(shù)據(jù)包的排序的缺點,也就是說,當報文發(fā)送之后,是無法得知是否安全完整的到達目的地。這個課設通過調用 java JDK 中 包下的 DatagramSocket 和 DatagramPacket 類,可以實現(xiàn)對用戶數(shù)據(jù)報文的控制,DatagramSocket類用于創(chuàng)建接收和發(fā)送 UDP的Spcket實例,調用DatagramPacket類用于處理報文,因為它可以將 Byte數(shù)組、目標地 址、目標端口等數(shù)據(jù)包裝成報文或者將報文拆卸成Byte數(shù)組。通過調用 DatagramSocket和DatagramPacket類來實現(xiàn)操作系統(tǒng)提
13、供的ping命令的類似功能。編程實現(xiàn)基于UDP的ping的思想可以概括為幾點:5.1 服務器端 PingServer功能:5.1.1 可以并發(fā)地為多個用戶服務;5.1.2 顯示用戶通過客戶端發(fā)送來的消息內容(包含頭部和payload);5.1.3 將用戶發(fā)送來的請求在延遲一段時間后返回給客戶端,作為收到請求的相應。5.1.4 通過java PingServer 9999 (端口號可以任意選擇)命令行來啟動服務器。5.2 客戶端PingClient功能:5.2.1 啟動都發(fā)送10個請求,發(fā)送一個請求后,最多等待1秒以便接收PingServer返回的響應消息。5.2.2 請求消息的payload中
14、包含有關鍵字 PingUDP、序號、時間戳等內容。5.2.3 為每個請求計算折返時間(RTT),統(tǒng)計10個請求的平均 RTT、min/max的RTT。5.2.4 通過 java PingClient localhost (本機 IP 地址)9999 命令行啟動。5.3 程序設計流程圖根據(jù)課程設計的要求,結合程序設計流程,本次設計按如下的流程進行六、源程序6.1 服務器端代碼import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketExcep
15、tion;/import java.util.Scanner;/*服務器端* author LinBingcheng*/public class PingServer extends Thread private int initPort; /監(jiān)聽的端口號數(shù)據(jù)包套接字接受到的數(shù)據(jù)分組數(shù)據(jù)包使用的緩沖區(qū)private DatagramSocket serverSocket; / private DatagramPacket receivePacket; /private byte口 buffer = new byte1024; /public PingServer(int initPort) t
16、his.initPort = initPort;public void run() System.out.println("編程實現(xiàn)基于 UDP 的 PING (Java)服務端");System.out.println("PING SERVER STARTED");/ System.out.print("請輸入監(jiān)聽的端口號:");/ Scanner scanner = new Scanner(System.in);/接收從系統(tǒng)指定輸入方式輸入的數(shù)據(jù)(默認 System.in為鍵盤)/ int initPort = scanner.n
17、extInt(); 獲取端口 port try /根據(jù)輸入的監(jiān)聽端口生成server端DatagramSocket實例serverSocket = new DatagramSocket(initPort); catch (SocketException e1) /捕獲到此異常一般是輸入的端口非法,或者被占用System.out.println("監(jiān)聽端口 " + initPort+ "失敗,端口非法或已被占用,請重新啟動輸入其他有效空閑端口 ");e1.printStackTrace();System.exit(0);/ 中止程序/死循環(huán),不斷的監(jiān)聽是否
18、有請求數(shù)據(jù)while (true) receivePacket = new DatagramPacket(buffer, buffer.length); /生成接收數(shù)據(jù)報包實例/監(jiān)聽是否有用戶發(fā)出新的request連接到PingServer/程序會陷入到該語句,知道有新的連接產(chǎn)生try serverSocket.receive(receivePacket); catch (IOException e) System.out.println("分組接受異常");e.printStackTrace();ServerThread thread = new ServerThread
19、(serverSocket, receivePacket);/至 U 止匕步說明有新的請求了,此時生成一個新的服務線程thread.start();/ 啟動線程Overridepublic void destroy。 serverSocket.close();/ 回收資源public static void main(String口 args) throws Exception PingServer pingServer = new PingServer(Integer.valueOf(args0);初始化服務器pingServer.start();/* PingServer處理多用戶請求的對
20、各個線程的* author LinBingcheng* /class ServerThread extends Thread private DatagramPacket receivePacket; /接受到的數(shù)據(jù)分組private DatagramSocket serverSocket; / 數(shù)據(jù)包套接字public ServerThread(DatagramSocket serverSocket, DatagramPacket receivePacket) this.receivePacket = receivePacket;this.serverSocket = serverSocke
21、t;Override public void run() byte buffer = new byte4096; / 數(shù)據(jù)使用的緩沖區(qū)long randomTime = (long) (Math.random() * 2000); /到此步說明接收到新連接,在此生成隨機數(shù),模擬傳輸延遲String sentence = null;/ 接收到的數(shù)據(jù)try sleep(randomTime);/休眠睡眠,用于模擬傳輸延遲 catch (InterruptedException e) e.printStackTrace();if (randomTime > 1000) 如果隨機數(shù)大于1000,
22、模擬數(shù)據(jù)包丟失sentence = "data losen" /數(shù)據(jù)丟失的信息 else sentence = (new String(receivePacket.getData().substring(0, 100);/ 將數(shù)據(jù)從 緩沖區(qū)輪換成字符串InetAddress host = receivePacket.getAddress(); /獲取客戶端的 ip 地址int port = receivePacket.getPort(); /獲取客戶端的通訊端口buffer = sentence.getBytes(); 請求數(shù)據(jù)轉換成 byte數(shù)組,用于發(fā)回客戶端Datag
23、ramPacket sendPacket = new DatagramPacket(buffer, buffer.length,host, port); /生成數(shù)據(jù)包,已經(jīng)保存好發(fā)送目的地的地址和端口了try serverSocket.send(sendPacket);/發(fā)送數(shù)據(jù)給客戶端 catch (Exception e) e.printStackTrace();System.out.println(sentence); /顯示請求結果public DatagramPacket getReceivePacket() return receivePacket;public void setR
24、eceivePacket(DatagramPacket receivePacket) this.receivePacket = receivePacket;public DatagramSocket getServerSocket() return serverSocket;public void setServerSocket(DatagramSocket serverSocket) this.serverSocket = serverSocket;6.2客戶端代碼import java.io.IOException;import .DatagramPacket;import .Datagr
25、amSocket;import .InetAddress;import java.text.SimpleDateFormat;import java.util.Date;/import java.util.Scanner;/* 客戶端* author LinBingcheng* /public class PingClient public static void main(String口 args) throws Exception / Scanner scanner = new Scanner(System.in);/ 接收從系統(tǒng)指定輸入方式輸入的數(shù) 據(jù)(默認System.in為鍵盤)St
26、ring host = args0; /scanner.nextLine(); / 獲取服務器端所在的主機地址int port = Integer.valueOf(args1);scanner.nextInt(); /獲取服務器端監(jiān)聽的端口Long口 rtt = new Long10; / 用于存儲rtt ,用于最后的統(tǒng)計for (int i = 1; i <= 10; i+) /模擬發(fā)送 10 條請求SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss.SS"); /時間戳格式Date s
27、endBefore = new Date(); /記錄發(fā)送前時間String sentence = "head: request " + i + " n" /模擬用的請求數(shù)據(jù) + "playload: PingUDP SequenceNumber:" + i + " TimeStamp:" + sdf.format(sendBefore) + "n"DatagramSocket clientSocket = new DatagramSocket(); /生成客戶端 DatagramSocket
28、實例InetAddress IPAddress = InetAddress.getByName(host); / 生成 ip 地址實例byte口 buffer = new byte1024; /數(shù)據(jù)包使用的緩沖區(qū)buffer = sentence.getBytes(); /將請求數(shù)據(jù)放進緩沖區(qū)內DatagramPacket sendPacket = new DatagramPacket(buffer, buffer.length, IPAddress, port); /生成發(fā)送數(shù)據(jù)包實例clientSocket.send(sendPacket); /發(fā)送到服務器端DatagramPacket
29、receivePacket = new DatagramPacket(buffer, buffer.length);/生成接收數(shù)據(jù)包實例try 接收從服務端返回的數(shù)據(jù)包clientSocket.receive(receivePacket); catch (IOException e) System.out.println("分組接受異常");e.printStackTrace();String receiveSentence = new String(receivePacket.getData(); / 將數(shù)據(jù)從緩 沖區(qū)輪換成字符串Date receiveAfter = n
30、ew Date(); /記錄接收后的時間rtti - 1 = receiveAfter.getTime() - sendBefore.getTime(); 計算 rttif( rtti - 1 > 1000) 如果接收時間大約1000ms ,視為數(shù)據(jù)包丟失rtti - 1 = (long) 1000;receiveSentence = "data losen"System.out.println(receiveSentence);顯示從 server 返回的數(shù)據(jù)端System.out.println("rtt:" + rtti - 1);/ 顯示
31、rttclientSocket.close(); / 關閉 socket /統(tǒng)計出平均rtt,最大rtt和最小rttlong sumRtt = 0;long maxRtt = 0;long minRtt = rtt0;for (int i = 0; i < 10; i+) if (rtti > maxRtt) maxRtt = rtti;if (rtti < minRtt) minRtt = rtti;sumRtt += rtti;System.out.println("average rtt: " + sumRtt / 10 + " milli
32、second"); System.out.println("max rtt: " + maxRtt);System.out.println("min rtt: " + minRtt);七、測試用例7.1 按 win + R ”鍵,在彈出的對話框中輸入“ cmd ”回車,如下:7.2 通過Cd”命令,進入源程序所在目錄國C :Wi n d owssy stem 32t m d. exeMici'asoft Vindaus6.3.96001<c> Microsoft Carpcrat ion « 保留所用權利
33、6;C: SUsersXLinSirigichengJe :t : >cd E: woi'kspacejauaJauallDFP1 NGSsrcE: wa rkspaceXjauaJauaUrPFl NGXsrc>7.3 輸入 javac PingClient.java ”命令,編譯 PingClient.java 程序 輸入javac PingServer.java ”命令,編譯 PingServer.java 程序 在相同目錄下生成兩個可執(zhí)行文件(沒有報錯說明編譯成功)qqC:Wi nd ssy$te m 2 2c md. cxe“in加wu【近本 £ &qu
34、ot;96001<c> 2013 Mitir-usoft CuriAiratIon 0 保弱所有權利口C;UsersxLinBinqchenq>e:E ; S>cd E : wot*h<jpacp SjnvaJavaUVPTIrcE:workspacejau4SJavjiUBPPI hGrc>Javac FinCLient.javaE :Xj-aya LJaidiiilJPPPI NGvc福。PxinQ|Sei'eih B j引/小法:I*加亨為e<?.J"句交例期覆蓋了已過山的AFI o 注:有美詳匐信息.請使用-Klint:dep
35、recation重新編譯電F:uovkspaceXjflUfliTfluallDPPf hCtvf:>-7.4 測試程序將class文件復制到簡單易讀取的位置此時需要啟動 PingServer和啟動PingClient ,打開兩個命令行,通過"cd”進入到文件存 放目錄輸入測試執(zhí)行命令:java PingServer 9999(9999是端口號可以是任意的)java PingClient localhost 9999 (localhost代表本機,即 127.0.0.1)命令進行啟動,并發(fā)送10個請求,請求信息payload包括了 PingUDP、SequenceNumber
36、、TimeStamp的內容,以及每個請求的折返時間,并統(tǒng)計 10個請求的平 均RTT以及最大RTT和最小RTT,此時PingClient客戶端收到PingServer服務器的返回信息 顯示如下:7.4.1 PingServer輸出結果如下S3C:Windows5/sterri32cmd,exe - iavd PingServer 99991iciLocoft Uindotfo_1版本 l .才968日1<u) 2013 Mluruffuf L Curpurdtluii > 保留所有權利6C: MJsep4LinBinsfcheng>e :|Ei S>cd binE:hl
37、n>jaa PinsfS*rver 9999 編程實現(xiàn)基干UDP的PIHC CJmQ服務惴 PIMC CERUER STARTED iIeIg lli>clie ad = request 2plaloafl : PinlIDP SediienceHiimbef:2 TimeStamii:2015-01-11 10i:35 :39.931卜七日dU requitisc 3plalaad: fintfUWP SequenceNLimber: TimeStanp:aIdlS-Ul-ll lM:3b :31 data loseFiead: request 6pJLa«/laad
38、- PinglJI)P £eq<us nceMumbei*. £ T imeStamp - 201£01-11 1&- 35 - 34 «9 80head: request 7pla9laad- Pin<UDP SequenceNumber-7 TimeStamp:2815-01-11 10:35:35.116Id Aid loeedata losehe ad - I'e(pnet 10plau/laad - FinLIDP ScquicnccHuiiTibci'= 10 TIncStcnps2015-01 -li 1
39、3:3S = 391297.4.2 PingClient 輸出結果如下MJsers MinBin Qche ng >e :"cdS Bquenc eHunhek*TimeStamp:2015-01-11bin?,1CQ9 ,losertt:I59J«t«l JuildyloHil: PinglIDP SequenceNunhet': 710:35:35.116Tim&Scanp;2015-01-11Mjiit>J<ivd Piny Cl lent IjvdlliusC 9?99tt :1»MU ead,ft 2lauloatlx FlngUDPtt:LG03覆 ±3 loSilead: request 3其夕LomdU PinfUDPiead: request b laT/Loeitl : PlngllBPfeQuenceHunlbeauemaqc! tt 1 ' m<ix rtt : 10DE cad : I'eqLie st 167layloail: PinqUUP SequenEeNunher:13 IineStamu:201E01-11icrosoft L/indous 假車 &.3J6癡c> 2S13
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年福州c1道路客運輸從業(yè)資格證怎么考
- 2024年交通職業(yè)考試網(wǎng)和客運駕駛員從業(yè)資格證考試題目
- 2024年嘉興c1道路客運輸從業(yè)資格證怎么考
- 普通地質學舒良樹各章作業(yè)習題及答案
- 倉庫管理員照管協(xié)議
- 化工原料供應合同模板
- 咖啡連鎖店臨時咖啡機租賃協(xié)議
- 碳匯林投資苗木土地租賃協(xié)議
- 證券市場成本控制
- 體育館裝修石膏線條施工合同
- 溫室氣體排放及減排策略
- 職業(yè)生涯規(guī)劃書助產(chǎn)
- 香濃可口的焦糖布丁
- 公墓宣傳推廣策劃方案
- 《從九一八事變到西安事變》【精準教學】
- 《亞里士多德》課件
- 分數(shù)階微積分簡介(大三下)
- 靜脈炎及靜脈外滲的相關知識
- 《女性生殖生》課件
- 項目管理與個人發(fā)展
- 電商物流行業(yè)培訓資料
評論
0/150
提交評論