版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)七 UDP Socket一本實(shí)驗(yàn)?zāi)康募耙螅? 掌握在TCP/IP體系結(jié)構(gòu)中UDP協(xié)議概念和應(yīng)用領(lǐng)域;學(xué)習(xí)UDP協(xié)議內(nèi)容,了解單播、廣播和組播的概念,掌握什么是D類IP地址及分類;2 掌握在JAVA程序設(shè)計(jì)中與UDP通信相關(guān)的類DatagramSocket和DatagramPacket;3 掌握在JAVA程序設(shè)計(jì)中利用UDP進(jìn)行組播的類MulticastSocket。4 完成以下各內(nèi)容程序,截存運(yùn)行結(jié)果圖,并提交實(shí)驗(yàn)報(bào)告。二基礎(chǔ)知識(shí)1UDP概念UDP(User Datagram Protocol) 用戶數(shù)據(jù)報(bào)協(xié)議 (RFC 768)是 OSI 參考模型中一種無(wú)連接的傳輸層協(xié)議,提供面向事務(wù)
2、的簡(jiǎn)單不可靠信息傳送服務(wù)。 UDP 協(xié)議基本上是 IP 協(xié)議與上層協(xié)議的接口。 UDP 協(xié)議適用端口分別運(yùn)行在同一臺(tái)設(shè)備上的多個(gè)應(yīng)用程序。在實(shí)際的Internet應(yīng)用中,UDP占據(jù)了半壁江山。UDP常用應(yīng)用和相關(guān)設(shè)置端口,如表4-1所示。表4-1 UDP常用應(yīng)用和相關(guān)設(shè)置端口2UDP套接字類在JAVA語(yǔ)言中,一個(gè)UDP Socket用于處理數(shù)據(jù)包的發(fā)送或接收業(yè)務(wù)。每一個(gè)數(shù)據(jù)包獨(dú)立的選擇路由進(jìn)行發(fā)送和接收。在兩臺(tái)計(jì)算機(jī)之間的多個(gè)數(shù)據(jù)包發(fā)送會(huì)選擇不同的路徑,并且到達(dá)順序也不同于發(fā)送順序。 在JAVA語(yǔ)言中,DatagramSocket類被用于發(fā)送和接收UDP數(shù)據(jù)包,定義如圖4-2所示。 例如: D
3、atagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888); 該語(yǔ)句相當(dāng)于: DatagramSocket s = new DatagramSocket(8888);這兩種情況都在本地創(chuàng)建一個(gè)DatagramSocket接收UDP端口8888的數(shù)據(jù)。其構(gòu)造方法:DatagramSocket() 在本地端口創(chuàng)建創(chuàng)建一個(gè)數(shù)據(jù)包套接字。 DatagramSocket(int port) 在本地指定端口創(chuàng)建創(chuàng)建一個(gè)數(shù)據(jù)包套接字。 DatagramSocket(int
4、;port, InetAddress laddr) 在本地指定的IP地址和端口創(chuàng)建創(chuàng)建一個(gè)數(shù)據(jù)包套接字。l DatagramPacket該類用于存儲(chǔ)數(shù)據(jù)包,UDP數(shù)據(jù)包用于實(shí)現(xiàn)無(wú)連接的數(shù)據(jù)提交服務(wù)。每個(gè)信息利用自己包中的信息獨(dú)立完成在計(jì)算機(jī)之間的傳遞。在2臺(tái)計(jì)算機(jī)之間傳遞的多個(gè)數(shù)據(jù)包可能選擇不同的路由,并且到達(dá)順序不同于發(fā)送順序。數(shù)據(jù)包的提交是不可靠的。DatagramPacket(byte buf, int length) 建立一個(gè)指定緩沖長(zhǎng)度的數(shù)據(jù)包;DatagramPacket(byte buf, int length, InetAddr
5、ess address, int port) 在指定的IP地址和端口上,建立一個(gè)指定緩沖長(zhǎng)度的數(shù)據(jù)包。3. 組播組播(Multicast)傳輸:在發(fā)送者和每一接收者之間實(shí)現(xiàn)點(diǎn)對(duì)多點(diǎn)網(wǎng)絡(luò)連接。如果一臺(tái)發(fā)送者同時(shí)給多個(gè)的接收者傳輸相同的數(shù)據(jù),也只需復(fù)制一份的相同數(shù)據(jù)包。它提高了數(shù)據(jù)傳送效率。減少了骨干網(wǎng)絡(luò)出現(xiàn)擁塞的可能性。IP多播通信必須依賴于IP多播地址,在IPv4中它是一個(gè)D類IP地址,范圍從到55,并被劃分為局部鏈接多播地址、預(yù)留多播地址和管理權(quán)限多播地址三類。l 局部鏈接多播地址范圍在55,
6、這是為路由協(xié)議和其它用途保留的地址,路由器并不轉(zhuǎn)發(fā)屬于此范圍的IP包;l 預(yù)留多播地址為55,可用于全球范圍(如Internet)或網(wǎng)絡(luò)協(xié)議;l 管理權(quán)限多播地址為55,可供組織內(nèi)部使用,類似于私有IP地址,不能用于Internet,可限制多播范圍。 多播套接字類MulticastSocket這個(gè)類用于發(fā)送和接收IP多播數(shù)據(jù)包。該MulticastSocket是一個(gè)UDP DatagramSocket, 增加了在internet上加入其它多播主機(jī)“組”的功能。UDP廣播發(fā)送建立在DatagramSocket
7、基礎(chǔ)上。用于接收廣播數(shù)據(jù)必須綁定在統(tǒng)配的地址上。一個(gè)多播組是建立在一個(gè)D類IP地址上和一個(gè)UDP端口上。D類IP地址的范圍是-55, 注意地址 是保留地址不能使用。在某些實(shí)現(xiàn)中,廣播數(shù)據(jù)包可以綁定在多個(gè)指定的地址上。一個(gè)終端需要加入一個(gè)組播組需要在指定的端口上建立一個(gè)MulticastSocket / 加入組播組,并在組內(nèi)發(fā)送問(wèn)候 . String msg = "Hello" InetAddress group = InetAddress.getByName(""); Mu
8、lticastSocket s = new MulticastSocket(8000); s.joinGroup(group); DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), group, 8000); s.send(hi); /獲得反饋消息 byte buf = new byte1000; DatagramPacket recv = new DatagramPacket(buf, buf.length); s.receive(recv); . /離開(kāi)多播組 s.leaveGroup(group);三類
9、及方法:1. DatagramSocket常用方法 InetAddressgetAddress() 獲得發(fā)送或接收到數(shù)據(jù)包的IP bytegetData() 獲得數(shù)據(jù) intgetLength() 獲得發(fā)送或接收的數(shù)據(jù)長(zhǎng)度 intgetPort() 獲得發(fā)送或接收的數(shù)據(jù)來(lái)對(duì)方的端口號(hào) SocketAddressgetSocketAddress() 獲得發(fā)送或接收數(shù)據(jù)的Socket地址 voidsetAddress(InetAddress iaddr) 設(shè)置發(fā)送數(shù)據(jù)的目的地址 voidsetData(byte
10、0;buf) 設(shè)置發(fā)送的數(shù)據(jù) voidsetData(byte buf, int offset, int length) 設(shè)置發(fā)送的數(shù)據(jù) voidsetLength(int length) 設(shè)置數(shù)據(jù)包長(zhǎng)度 voidsetPort(int iport) 設(shè)置數(shù)據(jù)包的端口號(hào) voidsetSocketAddress(SocketAddress address) 設(shè)置數(shù)據(jù)包的Socket2. DatagramPacket常用方法 voidbind(SocketAddress add
11、r)綁定數(shù)據(jù)包到指定的Socket voidclose() 關(guān)閉該UDP Socket voidconnect(InetAddress address, int port) 連接遠(yuǎn)端地址 voidconnect(SocketAddress addr) 連接遠(yuǎn)端地址 voiddisconnect() 斷開(kāi)連接 booleangetBroadcast() 測(cè)試能否廣播 InetAddressgetInetAddress()獲得已連接的IP地址 InetAddressgetLocalAddress()
12、 獲得本地的IP地址 intgetLocalPort() 獲得本地的端口號(hào) SocketAddressgetLocalSocketAddress()獲得本地的Socket地址. intgetPort()獲得指定數(shù)據(jù)包的端口號(hào) SocketAddressgetRemoteSocketAddress()獲得遠(yuǎn)端的Socket地址. intgetSoTimeout() 獲得數(shù)據(jù)包超時(shí)時(shí)間 booleanisBound() 獲得綁定Socket的狀態(tài) booleanisClosed() 獲得Socket是否關(guān)閉 boole
13、anisConnected() 獲得Socket是否連接 voidreceive(DatagramPacket p) 接收數(shù)據(jù)包 voidsend(DatagramPacket p) 發(fā)送數(shù)據(jù)包 voidsetBroadcast(boolean on) 開(kāi)啟/關(guān)閉廣播 voidsetReceiveBufferSize(int size) 設(shè)置接收緩存 voidsetSendBufferSize(int size)設(shè)置發(fā)送緩存 voidsetSoTimeout(int time
14、out) 設(shè)置超時(shí)時(shí)間,毫秒級(jí)3)MulticastPacket常用方法 booleangetLoopbackMode() 獲得本地環(huán)回測(cè)試模式 intgetTimeToLive()獲得數(shù)據(jù)包生命時(shí)間 voidjoinGroup(InetAddress mcastaddr) 加入組播組 voidleaveGroup(InetAddress mcastaddr) 離開(kāi)組播組 voidsetLoopbackMode(boolean disable)設(shè)置本地環(huán)回測(cè)試 voidsetTimeToLive(int&
15、#160;ttl) 設(shè)置數(shù)據(jù)包生命時(shí)間4 知識(shí)填空1. 在應(yīng)用層上HTTP協(xié)議使用傳輸層( )協(xié)議;應(yīng)用層DNS協(xié)議使用傳輸層( )協(xié)議;應(yīng)用層FTP協(xié)議使用傳輸層( )協(xié)議;應(yīng)用層IGMP協(xié)議使用傳輸層( )。2. 信息傳播的方式有( )、( )和( )。3. 在JAVA語(yǔ)言中,.net類庫(kù)包中有關(guān)于UDP通信的類,包括( ),( )和( )。4. DatagramSocket類中的發(fā)送數(shù)據(jù)包的方法是( ),接收數(shù)據(jù)包的方法是( )。5. DatagramPacket類中從數(shù)據(jù)報(bào)中獲得字節(jié)數(shù)據(jù)的方法是( ),設(shè)置數(shù)據(jù)報(bào)的方法是( )。6. IPv4地址,通常由2個(gè)部分組成,分別是:網(wǎng)絡(luò)號(hào) 和
16、 主機(jī)號(hào),廣播地址是( )全為1,如果主機(jī)號(hào)全為0,則該IP地址表示( )。7. IP組播利用( )類IP地址,在Java語(yǔ)言中有( )類用于定義組播對(duì)象,加入組播組的方法是( ),離開(kāi)組播組的方法是( )。5 程序填空1. 在本地建議一個(gè)UDP客戶端import java.io.*;import /引用網(wǎng)絡(luò)類庫(kù)class exp_6_1a public static void main(String args) DatagramSocket ds = null; try ds = new (); /UDP客戶端套接字構(gòu)造方法 System.out.println(ds.getLocalAdd
17、ress(); System.out.println(ds.getLocalPort(); catch(Exception e) System.err.println(e.getMessage(); 2. 實(shí)現(xiàn)一個(gè)UDP客戶端的數(shù)據(jù)接收和發(fā)送import java.io.*; /引入IO類庫(kù)import .*; /引入網(wǎng)絡(luò)類庫(kù)class exp_6_2 implements Runnable DatagramSocket ds = null;/新建一個(gè)DatagramSocket實(shí)例 DatagramPacket p = null; InetAddress address = null; in
18、t port = 0; byte buf = byte256; /開(kāi)辟接收數(shù)據(jù)緩沖區(qū),256 B public exp_6_2 () try ds = new DatagramSocket(1080);/開(kāi)啟本地UDP 1080端口 System.out.println("本地開(kāi)啟UDP 1080端口"); catch(IOException e) System.err.println(e.toString(); public void run() try p = new DatagramPacket( , buf.length); ds.receive(p); Syste
19、m.out.println("接收的數(shù)據(jù):" + new String(p. ); Thread.sleep(2000); address = p.getAddress(); port = p. ; System.out.println("請(qǐng)求端Socket" + address.toString() + ":" + port); buf = "從A端返回信息".getBytes(); p = new DatagramPacket(buf, buf.length, , port); ds. (p); ds.clos
20、e(); catch(Exception e) System.err.println(); public static void main(String args ) exp_6_2 dr = new exp_6_2 (); Thread tdr = new (dr); tdr.start(); 6 實(shí)驗(yàn)實(shí)例:1) 探測(cè)本地UDP端口占用情況import .*;class PortCount /共享資源,計(jì)數(shù)器count private int port;/共享資源 synchronized public int add() port = port + 1; return port; clas
21、s ScanThread implements Runnable private PortCount pc; private String name = null; public ScanThread(String name, PortCount pc) = name; this.pc = pc; public void run()/必需的重寫(xiě) int i = 0; DatagramSocket ds = null; while(true) try i = pc.add(); if(i > 100)break; ds = new DatagramSocket(i);
22、System.err.println("本機(jī)端口:" + i + "空閑"); Thread.sleep(100); catch(Exception e) System.err.println(e.toString(); class ScanLocalUDPPort public static void main(String args) throws Exception PortCount pc = new PortCount();/代表共享資源的變量 ScanThread st1 = new ScanThread("線程1",pc
23、); /創(chuàng)建子線程 ScanThread st2 = new ScanThread("線程2",pc); ScanThread st3 = new ScanThread("線程3",pc); Thread tst1 = new Thread(st1); Thread tst2 = new Thread(st2); Thread tst3 = new Thread(st3); long begin = System.currentTimeMillis(); tst1.start();tst2.start();tst3.start(); tst1.join(
24、); tst2.join(); tst3.join(); long end = System.currentTimeMillis(); System.out.println("探測(cè)localhost的TCP端口,共耗時(shí)" + (end - begin)+"毫秒"); 報(bào)告內(nèi)容:實(shí)驗(yàn)時(shí)分別測(cè)試開(kāi)啟1個(gè)線程、5個(gè)線程和10個(gè)線程,探測(cè)范圍0-65535,查看耗時(shí)情況2) 基礎(chǔ)的UDP通信/UDP A端import java.io.*; /引入IO類庫(kù)import .*; /引入網(wǎng)絡(luò)類庫(kù)class exp_6_2 implements Runnable Dat
25、agramSocket ds = null;/新建一個(gè)DatagramSocket實(shí)例 DatagramPacket p = null; InetAddress address = null; int port = 0; byte buf = new byte256; /開(kāi)辟接收數(shù)據(jù)緩沖區(qū),256 B public exp_6_2 () try ds = new DatagramSocket(1080);/開(kāi)啟本地UDP 1080端口 System.out.println("本地開(kāi)啟UDP 1080端口"); catch(IOException e) System.err.
26、println(e.toString(); public void run() try p = new DatagramPacket(buf, buf.length); ds.receive(p); System.out.println("接收的數(shù)據(jù):" + new String(p.getData(); Thread.sleep(2000); address = p.getAddress(); port = p.getPort(); System.out.println("請(qǐng)求端Socket" + address.toString() + "
27、:" + port); buf = "從A端返回信息".getBytes(); p = new DatagramPacket(buf, buf.length, address, port); ds.send(p); ds.close(); catch(Exception e) System.err.println(); public static void main(String args ) exp_6_2 dr = new exp_6_2 (); Thread tdr = new Thread(dr); tdr.start(); /UDP B端import j
28、ava.io.*; /引入IO類庫(kù)import .*; /引入網(wǎng)絡(luò)類庫(kù)class DatagramSender implements Runnable DatagramSocket ds = null;/新建一個(gè)DatagramSocket實(shí)例 DatagramPacket p = null; InetAddress address = null; int port = 0; byte buf = new byte256; /開(kāi)辟發(fā)送數(shù)據(jù)緩沖區(qū),256 B public DatagramSender() try ds = new DatagramSocket(1065);/開(kāi)啟本地UDP 10
29、65端口 System.out.println("本地開(kāi)啟UDP 1065端口"); catch(IOException e) System.err.println(e.toString(); public void run() try address = InetAddress.getByName("localhost"); / 給出接收端地址 port = 1080; / 接收端口號(hào) buf = "從B端發(fā)送單播信息".getBytes(); / 構(gòu)造待發(fā)送的數(shù)據(jù)報(bào) p = new DatagramPacket(buf, buf.
30、length, address, port); ds.send(p); Thread.sleep(2000); p = new DatagramPacket(buf, buf.length); / 接收數(shù)據(jù)報(bào) ds.receive(p); / 接收數(shù)據(jù) System.out.println("接收的數(shù)據(jù):" + new String(p.getData(); address = p.getAddress(); port = p.getPort(); System.out.println("請(qǐng)求端Socket" + address.toString() +
31、 ":" + port); ds.close(); / 關(guān)閉連接 catch(Exception e) System.err.println(e.toString(); public static void main(String args ) throws IOException DatagramSender ds = new DatagramSender (); Thread tds = new Thread(ds); tds.start(); /注意接收和發(fā)送時(shí)緩存buf 中的內(nèi)容/修改為可循環(huán)發(fā)送消息的形式3) UDP文件傳輸import java.io.IOExc
32、eption;import .DatagramPacket;import .DatagramSocket;import .SocketException;public class CudpSocket DatagramPacket dp = null; DatagramSocket dgsocket=null; public CudpSocket() try byte buf = new byte1000; dgsocket = new DatagramSocket(12345); dp = new DatagramPacket(buf,buf.length); catch (SocketEx
33、ception e) System.err.println(e.getMessage(); public static void main(String args) System.out.println("enter the server"); CudpSocket css = new CudpSocket(); try css.dgsocket.receive(css.dp); byte data = css.dp.getData(); System.out.println("datac.length : "+data.length); for(int
34、 i=0;i<data.length;i+) System.out.println(datai); NetFileW nfw = new NetFileW("C:/test/b.txt"); nfw.write(css.dp.getData(); / System.out.println(new String(css.dp.getData(); catch (IOException e) System.err.println(e.getMessage(); /import java.io.DataInputStream;import java.io.File;impo
35、rt java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class NetFileR private String filePath; public NetFileR(String filePath) this.filePath = filePath; public byte getData() throws IOException File file = new File(filePath); FileInputStream filein = new F
36、ileInputStream(file); DataInputStream in = new DataInputStream(filein); byte data = new byte8; in.read(data); return data; public String getFilePath() return filePath; public void setFilePath(String filePath) this.filePath = filePath; /import java.io.File;import java.io.FileNotFoundException;import
37、java.io.FileOutputStream;import java.io.IOException;public class NetFileW public NetFileW(String filePath) this.filePath = filePath; private String filePath; public void write(byte data) throws IOException File file = new File(filePath); FileOutputStream out = new FileOutputStream(file); out.write(d
38、ata); public String getFilePath() return filePath; public void setFilePath(String filePath) this.filePath = filePath; /import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .Inet4Address;import .SocketException;import .UnknownHostException;public class SudpSocket private Da
39、tagramSocket dgs = null; private DatagramPacket dgp = null; public SudpSocket(String host,int prot,byte data) try dgs = new DatagramSocket(9999); Inet4Address target=null; try target = (Inet4Address) Inet4Address.getByName(host); catch (UnknownHostException e) System.err.println(e.getMessage(); dgp
40、= new DatagramPacket(data,data.length,target,prot); catch (SocketException e) System.err.println(e.getMessage(); public static void main(String args) NetFileR nf = new NetFileR("C:/test/a.txt"); SudpSocket sps; try byte data = nf.getData(); System.out.println("data.length : "+dat
41、a.length); for(int i=0;i<data.length;i+) System.out.println(datai); sps = new SudpSocket("70",12345,data); catch (IOException e1) System.err.println(e1.getMessage(); sps=null; try sps.dgs.send(sps.dgp); catch (IOException e) System.err.println(e.getMessage(); sps=null; Syst
42、em.out.println("over the sending"); /將該程序簡(jiǎn)化4)UDP組播/組播接收端import java.io.*; /引入IO類庫(kù)import .*; /引入網(wǎng)絡(luò)類庫(kù)public class DatagramReceiver implements Runnable String GROUP_IP = "" int port = 1080; MulticastSocket multicastSocket = null; DatagramPacket p = null; byte buf = new byte256; /開(kāi)辟數(shù)據(jù)緩沖區(qū),256 B用于接收和發(fā)送數(shù)據(jù) public DatagramReceiver () try multicastSocket = new MulticastSocket(port); InetAddress group = InetAddress.getByName(GROUP_IP); multicastSocket.joinGroup(group); /加入組播組 catch(Exception e) System.err.println(e.toString(); public void run() try System.out.printl
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度水陸聯(lián)運(yùn)貨物保險(xiǎn)及運(yùn)輸合同
- 二零二五年度新能源儲(chǔ)能技術(shù)聘用合同8篇
- 二零二四年度信息化設(shè)備融資租賃管理合同3篇
- 課件:正確認(rèn)識(shí)高職院校內(nèi)部質(zhì)量保證體系診斷與改進(jìn)
- 二零二五年度牧草生物質(zhì)能項(xiàng)目合作協(xié)議4篇
- 2025版農(nóng)家樂(lè)民宿租賃管理服務(wù)合同2篇
- 二零二五版年薪制勞動(dòng)合同:房地產(chǎn)企業(yè)銷售精英激勵(lì)方案4篇
- 第三單元 資產(chǎn)階級(jí)民主革命與中華民國(guó)的建立(解析版)- 2023-2024學(xué)年八年級(jí)歷史上學(xué)期期中考點(diǎn)大串講(部編版)
- 2025年度個(gè)人家政服務(wù)分期支付合同范本2篇
- 二零二五年度地鐵車站安全門系統(tǒng)采購(gòu)合同
- 2024年蘇州工業(yè)園區(qū)服務(wù)外包職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 人教版初中語(yǔ)文2022-2024年三年中考真題匯編-學(xué)生版-專題08 古詩(shī)詞名篇名句默寫(xiě)
- 2024-2025學(xué)年人教版(2024)七年級(jí)(上)數(shù)學(xué)寒假作業(yè)(十二)
- 山西粵電能源有限公司招聘筆試沖刺題2025
- ESG表現(xiàn)對(duì)企業(yè)財(cái)務(wù)績(jī)效的影響研究
- 醫(yī)療行業(yè)軟件系統(tǒng)應(yīng)急預(yù)案
- 使用錯(cuò)誤評(píng)估報(bào)告(可用性工程)模版
- 《精密板料矯平機(jī) 第2部分:技術(shù)規(guī)范》
- 黑枸杞生物原液應(yīng)用及產(chǎn)業(yè)化項(xiàng)目可行性研究報(bào)告
- 2024年黑龍江省政工師理論知識(shí)考試參考題庫(kù)(含答案)
- 四年級(jí)上冊(cè)脫式計(jì)算300題及答案
評(píng)論
0/150
提交評(píng)論