版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《TCP/IP协议分析》课程试验指导书1TCP套接字编程试验试验目的:生疏基于java的TCP套接字网络编程方法;生疏TCPClient套接字编程流程;生疏TCPServer套接字编程流程;生疏javaTCPjava类;试验任务:实现一个根本的TCP套接字Client/Sener模式的网络应用系统,该系统中效劳器端监听网个类似于Echo效劳的效劳器程序。指导说明:1TCP客户端根本编程流程11TCP客户端工作流程创立流套接字向远程效劳器发起连接恳求;猎取套接字字节流与远程效劳器进展数据通信;通信完毕.关闭套接字;基于Java的TCP客户端编写根本步骤说明基于Java的TCP客户端会使用下述类或接口:Socket、InetAddress%InputStream%OutPutStream等.根本上这些可能在JavaTCP客户端程序中使用的类大致会包含于下述常用的Java库文件中:.*、java.io.*、java.util.*等°因此编写该TCPjava类文件的开头.固然也可以在事后添加。TCPJavaJava库文件import.*;importjava.io.*;这里介绍的一个最根本的TCP客户谎程序中根本就只会使用上述java库文件中所包含的类了。java厚文件。与远程效劳器端发起TCP连接恳求TCP客户端要完成与远程效劳器的TCP连接的工作,需要做以下几件事情:设定TCP效劳器程序所运行的计算机网络接□地址(IP地址):设定TCP效劳器程序所监听的网络端□号;向远程TCPTCP连接恳求;看似很多事情,其实在java中编程完成这些事情,相当简洁。通常状况下,假设要连接某IP地址或者该主机名。IP或主机名来在TCP客户端程序中构造一个InetAddressIP=23;主机名=whpucomputerInetAddressserverIP=InetA(ldress.getBvName(u23,r);或InetAddressserverIP=InetAddress.getByNameC”whpucompiiter“);~~光知道远程效劳器程序所运行的主机地址还不酸,TCP号为:8888O知道了远程效劳器程序所运行于的主机地址和其所监听的端□号后,就可以使用Socket类发起与远程效劳器程序建立TCP连接的恳求了,具体代码如下:Socketclientsock=newSocket(serverIP,8888);~~上直代码复制符右端的Socket万法假设成功返回,那么就会返回一个Socket类对象的引用给Socket类对象引用来完成与远程效劳器程序的通信工作了。不过,该段代码有个比较明显的问题:8888(^0程习惯。具体如何跟好的设置端□号.后面整体说明旳进展解释。到此,TCP客户谎编写发起向TCP效劳器程序的TCP连接恳求的代码就完成了,整体代码大致如下所示:InetAddressserverIP=InetAddress.getByName(“whpucompiiter””);Socketclientsock=newSocket(serverIP»8888);与远程TCP效劳器程序逬行通信基于java的TCP套接字程序中,与远程网络程序逬行通信主要使用的是Socket类中的两个类成员InputSteamOiHpinStrcamSocket类的成员需要使用Socket类供给的两个方法:getlnputStream和getOutputStreamo在前面介绍的代码中,假设己经成功与远程效劳器程序建立了一个TCP连接,并猎取了一个SocketInputstreamOutputStrcam的对象的代码如下:InputStreainin=clientsock.getlnputStreamO;Outputstreamout=clientsock.getOutputStreain;javaInputStreamOmputStrcam类对象,一来直接InputStreamOutputStrcamI/O操作,这样使用性能不高,特别是每次输入或输出的数据比较少的状况下,会反复进展I/O操作,由于每次I/O操作会消耗大量处理肘间,因此势必带来运行效率不高的问题。对InputStream的封装InputStream流对象中的字节数据,就可以对I叩utStrcam字节流对象进展封装,代码如下所示:InputStreamReaderin=newInputStreainReader(clientsock.getInputStream);-上面的代码只是将原来以字节访问方式的流转换为以字符方式访问的流,并没有转变I/O操作的方式,为了提高访冋信息,我们需要为流供给缓冲区,以便不必每次操作流时都产生I/O操作。i(Outputstream),者显式的调用流的flush方法时,缓冲区中的数据才会真实的写入文件流,否则.不会执行将缓冲^(InputStream),地输入流传送来的数据,而在缓冲区己满时.表示外界向本地发送数据的速度快于本地处理输入流BufferedReaderin=newBufferedReader(newInputStreamReader(clientsock.getlnputStreamO));对Outputstream的封装对于Oinpu⑸reamInputStream。具体代码如下:BufferedWriterout=newBufferedVVriter(newInputStreamWriter(clientsock.getOutputStream));为了更简洁的打印出缓冲区中的字符串,可以逬一步对BufferedWriter对象逬行封装,例如:Printwriterout=newPrintWrite(newBufferedVVriter(newInputStreamWriter(clientsock.getOutputStreamO)));1.2.4Client业务规律实现这里需要实现的Client功能如下描述:10Server端发送字符串”HelloServer“+i(i0<=i<10),Server的反响信息,并将Server反响信息打印到屏幕上。”ServerTCP连接的套接字对象:clientsockoClient功能描述,具体的代码实现如下:for(inti=0;i<10;i++){outprintln(HhelloServer11+i);outflushO;Stringstr=in.rea(ILine;Systein.out.println(str);以上代码中将循环执行10次的代码的工作内容如下:out是封装了套接字输出流的Printwriter对象,调用PrintWriter对彖的printin方法,会将”HelloServeri”写入缓冲区中.然而,这并不意味着缓冲区的内容会写入到套接字的输出流对象中,只有调用0山的flush方法后,缓冲区的数据才会发送到套接字的输出流对象,网路才有可能将数据发送出去。Server端回馈的信息,假设,Server回馈信息到来,那么该方法就会始终堵塞在哪里不会返回;而且就算Server端有数据返回,但是readLineServer端回馈的数据最后肯定要加上/血这两个字符,这可以手动添加到ServerPrintWriter对象的printin方法,该方法会自动为字符串末尾添加/r/%提示:在实际的网络应用程序中,避开使用Printin和readLine方法,虽然这些方法在处理字符串方面格外简洁好用,但是由于不⑥的操作系统的文本行完毕符各不一样,这会导致跨12.5TCP 连接的关闭ClientServer»Socketclose方法来关闭套接字,此时.假设系统套接字缓存中还有数据未发送.系统会尝试连续发送数据,TCP/IP协议栈也同时会向ServerFINServer.ServerACK确认FINTCPServerTCP/IP协议栈也发过来FIN包.并且Client端的TCP/IP协议栈发送对此次FINACK包后,整个TCP连接才完整关闭。当ClinetcloseServer-1或者null.通过这可以推断出TCP连接的远端程序己经关闭了套接字,本地也可以关闭TCP连接的套接字了。然而.这种靠底层TCP/IP协议机制来掌握的套接字关闭的时机,不是特别抱负。最好的方式是在Client和Server端之间协商一种应用层的连接完毕的机制。例如:out.println(*”END,”);out.flushO;~~在Client不想再保持连接时.就事先向ServerTCP连接的意图。如上面代码所示,在Client发送完全部数据之后,向Server谎发送一个字符卑“END”Server端在Client种机制保证在ServerClientTCP/IP发送的HNClient己经断幵的状态,这种方法确定更好一些。在发送了“END“字符串后,Client就可以无需再去考虑Server的close方法关闭套按字。clientsock.close;13TCPClient 完整程序源码例如importjava.io.*;import.*;publicclassClient{publicstaticvoidmain(String[]args)throwsIOException{InetAddressaddr=InetA(ldress.getByNaine(null);Socketsocket=newSocket(a(l(lr,8888);BufferedReaderin=newBufferedReader(newInputStreainReader(socket.getlnputStreamO));PrintWriterout=newPrintWriter(newBufferedVVriter(newOutputStreamWriter(socket.getOutputStreamO)));for(intI=0;i<10;i++){out.println(nhow(lyu+i);out.flushO;Stringstr=in.rea(ILine;Systein.out.println(str);}out.printlnC”EN”)out.flush;Systein.out.println(nclosing...H);socket.close;TCP效劳端根本编程流程TCP效劳端工作流程通过指定端□创立效劳器套接字,调用accept方法监听端口,接收将要到来的连接恳求;通过accept通信;本次通信完毕,关闭accept方法返回的流套接字;循环到第2步,连续监听;基于Java的TCP效劳端编写根本步骤说明基于Java的TCP客户潇会使用下述类或接口:ScrvcrSockct、Socket、InetAddress,Inputstream,OulPutStream等,根本上这些可能在JavaTCP客户端程序中使用的类大致会包含于下述常用的Java库文件中:.*、java.io.*、java.util.*等。因此编写该TCP的java类文件的开头.固然也可以在事后添加。TCPJavaJava库文件import>*;importjava.io.*;这里介绍的一个最根本的TCP效劳谎程序中根本就只会使用上述java库文件中所包含的类了。大家可以依据编写的程序的需要.视状况引入更多的java库文件。创立ServerSocket效劳器端一般是被动承受远程效劳恳求,因此必需要有一个事先商定好的固定监听端口号.并且效劳器不能只为一个客户谎供给效劳,基于此特性,效劳器端应当在监听到网络上到来的效劳恳求后,利用一个的套接字与客户端建立TCP连接,并逬行通信.而不能使用该监听网络的基于上述描述,java在构建TCP效劳器程序肘,供给了一个名为ServerSocket的类,用来完成TCP效劳器端监听网络的工作。构造ServerSocket端逬行连接肘,指定正确的连接端□号。构造ServerSocketIP地址,这样可以保证效劳器程序所运行的计算机假设有多个网络接□时,不管是从那个网络接□到来的数据,只要指定的谎□号是该效劳器程序所期望的.那么数据都会被该效劳器程序所承受。1:该方法创立一个己8888之上的监听套接字intlistenPort=8888;ServerSocketlistener=newServerSocket(listenPort);2:没有绑定到特定端□号的监听套接接字的bind方法.将套接字地址绑定intlistenPort=8888;InetAddresslocallP=InetAddress.getByName(null);InetSocketAddresslocalAddr=newInetSocketAddress(locallRlistenPort);ServerSocketlistener=newServerSocket;listener.bind(localAddr);到该套接字上。到该套接字上。223 监听网络,承受连接恳求,并逬行通信调用Serversocketaccept方法,监听网络,效劳恳求到来成功连接后返回连接套接字;猎取连接套接字的输入字节流和输出字节流;接收数据、处理数据,发送数据;关闭连接套接字;while(true){Socketconnectsock=listener.accept;BufTeredReaderin=newBufferedReader(newInputStreainReader(connectsock.getlnputStreamO));PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(connectsock.getOutputStreamO)));while(true){Stringstr=iikreadLineO;if(nENDn.equals(str))break;System.out.printIn(1*Echoing:H+str);out.printlnC”fig务器反响:“+str);out.flushO;}connectsockclose;TCPServer 完整程序源码例如importjava.io.*;import*;publicclassServer{publicstaticvoidmain(String[]args)throwsIOException{intlistenPort=8888;ServerSocketlistener=newServerSocket(listenPort);while(true){Socketconnectsock=listener.accept;BufferedReaderin=newBufferedReader(newInputStreainReader(connectsockgetlnputStreamO));PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamVVriter(connectsockgetOutputStreamO)));while(true){Stringstr=in.readLine;if(,tEND,t.equals(str))break;Systeni.out.println(MEchoing:H+str);out.printin(“效劳器反响:”+str);out.flushO;}connectsock.close;}思考题:认真理解IP地址、域名、端□号这几个槪念的实际所指,并结合实际应用状况的各种可能性思考它们之间的关系。试验要求:java的TCP套接字编写client/server模式网络包含:试验目的:试验任务:试验结果截图:思考题答复:〔假设有的话〕试验总结:试验2UDP 试验目的:生疏基于java的UDP套接字网络编程方法;生疏UDPClient套接字编扌呈流程;生疏UDPServer套接字编程流程;生疏javaUDPjava类:试验任务:实现一个根本的UDP套接字Clicnt/Scrvcr模式的网络应用系统.该系统中客户端通过键盘承受用户输入,并将用户输入内容通过UDP协议发送给效劳器端;效劳器端监听网络,承受Echo效劳的效劳器程序。指导说明:1UDP客户端根本编程流程UDP客户端工作流程创立数据报套接字〔邮筒〕.用于发送和接收数据报;创立发送型DatagramPacket对象〔信封〕,并发送给效劳器;创立接收型DatagramPacket对象〔信封〕,从网络接收效劳器数据;UDP客户端完整程序源码例如importjava.io.*;import.*;publicclassSiinpleUDPClient{publicstaticvoidmaiiKStringargs[]〕throwsException{〃基于系统输入流构造具有缓冲区的字符流刘象,用于接收键盘输入BufferedReaderinFromUser=newBufferedReader(newInputStreamReader(System.in));〃构造数据报套接字DatagramSocketclientsocket=newDatagramSocket;〃预备DatagramPacket对象的地址和数摇缓冲区InetAddressIPAddress=InetAddress.getByName(Mlocalhostu);byte[]sendData=newbyte[1024];bvte[]receiveData=newbyte[1024];while(true){Stringsentence=inFromUser.readLine;〃从输入终端接收字符串sendData=sentence.getBvtes;//将字符串以字节形式保存于字节数组中DatagramPacket对象DatagrainPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,9876);clientsocket.send(sendPacket);//发送数据报DatagramPacket对象DatagrainPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);clientSocket.receive(receivePacket)^/Jg收UDP协议发送来的数据DatagrainPacket对象缓冲区,构造字符串StringmodifiedSentence=newString(receivePacket.getDataO//^得缓冲区的字节数组首地址0〃从缓冲区中第一个要读取的字节相对于首地址的偏移量receivePacket.getLength//^际从网络上接收的字节数);Systeni.out.println(1*FROMSERVER:”+modifiedSentence);UDP效劳端根本编程流程UDP效劳端工作流程创立具有固定端□号的数据报套接字〔觎筒〕.用于发送和接收数据报;创立接收型DatagramPacket对彖〔信封〕,UDP协议传送来的客户端数据;创立发送型DatagramPacket对彖〔信封〕,发送会送数据报文给客户潇;UDP效劳端完整程序源码例如importjava.io.IOException;import.*;publicclassSimpleUDPServer{publicstaticvoidmain(String[]args)throwsIOException{〃构造具有固定端□号的数据报套接字DatagramSocketserverSocket=newDatagramSocket(9876);〃定义缓冲区byte[]receiveData=newbyte[1024];byte[]sendData=newbyte[1024];while(true){ 〃构造接收型缓冲区DatagramPacketreceivePacket=newDatagran)Packet(receiveData,receiveData.length);serverSocket.receive(receivePacket);//^收UDP协议发送来的数摇}思考题:
〃通过接收数据报的缓冲数据构造字符串Stringsentence=newString(receivePacket.getData(),O,receivePacket.getLength);System.out.println(MRECEIVED:M+sentence);〃猎取该数据报的发送者IP地址InetAddressIPAddress=receivePacket«getAddress;〃猎取该数据报的发送者端□号intport=receivePacket.getPort;備字符串字符转换为大写StringcapitalizedSentence=sentence.toUpperCase;sendData=capitalizedSentence.getBytes;〃构造发送型DatagramPacket对象DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress^port);serverSocket.send(sendPacket) 在基于l:DP协议的网络程序中,对于数据报文的缓冲区大小的设置,具体会有那些状况〔可能性比较大的〕?选择某种具体状况下,分析会带来哪些实际的编程问题?假设:Client端:接收缓冲为:c.recvbuff;发送缓冲为:c.sendbuff;
Server谢:接收缓冲为:s_recvbuff;发送缓冲为:s_sendbuff;例如:一种可能的状况与发送数据大小的关系:c_recvbuff=c_sendbuff=s_recvbufT=s_sendbuff>data_size;crecvbuff=csenclbuff=srecvbuff=ssendbuff<datasize;试验要求:java的UDP套接字编写client/server模式网络应含:试验目的:试验任务:试验结果截图:思考题◎答:〔假设有的话〕试验总、结:3TCPEcho效劳器试验目的:学握java的多线程的编程万法;生疏多线程的网络应用程序的编程方法;试验任务:11中所编写的TCPEcho效劳器程序,使之成为一个具有多通信效劳。指导说明:Java线程的使用使用线程的步骤创立数据报套接字〔邮筒〕.用于发送和接收数据报;创立发送型DatagramPacket对彖〔信封〕,并发送给效劳器;创立接收型DatagramPacket对彖〔信封〕,从网络接收效劳器数据:UDP客户端完整程序源码例如importjava.io.*;import.*;publicclassSimpleUDPClient{publicstaticvoidinain(Stringargs[])throwsException〃基于系统输入流构造具有缓冲区的字符流对象,用于接收键盘输入BufferedReaderiiiFromUser=newBufferedReader(newInputStreaniReader(Systein.in));〃构造数据报套接字DatagramSocketclientsocket=newDatagramSocket;〃预备DatagramPacket对象的地址和数据缓冲区InetAddressIPAddress=InetAddress.getByName(MlocalhostH);byte[]sendData=newbyte[1024);byte[]receiveData=newbyte[1024];while(true){Stringsentence=inFroinUser.readLine;〃从输入终端接收字符卑sendData=sentence.getBvtesO;〃将字符串以字节形式保存于字节数组中〃构造发送型DatagramPacket对象DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,9876);clientSocket.send(sendPacket);//^送数据报DatagramPacket刘象DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);clientSocket.receive(receivePacket);//^收UDP协议发送来的数据DatagramPacket对象缓冲区,构造字符串StringniodifiedSentence=newString(receivePacket.getData(得缓冲区的字节数组首地址0〃从缓冲区中第一个要读取的字节相对于首地址的偏移■receivePacket.getLengthO//^际从网络上接收的字节数);System.out.println(MFROMSERVER:11+modifiedSentence);UDP效劳端根本编程流程UDP效劳端工作流程创立具有固定端□号的数据报套接字〔觎筒〕.用于发送和接收数据报;创立接收型DatagramPacket对彖〔信封〕,UDP协议传送来的客户端数据;创立发送型DatagramPacket对彖〔信封〕,发送会送数据报文给客户潇;UDP效劳端完整程序源码例如importjava.io.IOException;import.*;publicclassSimpleUDPServer{publicstaticvoidmain(String[]args)throwsIOException{〃构造具有固定端□号的数据报套接字DatagramSocketserverSocket=newDatagramSocket(9876);〃定义缓冲区byte[]receiveData=newbyte[1024];byte[]sendData=newbyte[1024];while(true){ 〃构造接收型缓冲区DatagramPacketreceivePacket=newDatagran)Packet(receiveData,receiveData.length);serverSocket.receive(receivePacket);//^收UDP协议发送来的数摇〃通过接收数据报的缓冲数据构造字符串Stringsentence=newString(receivePacket.getData(),O,receivePacket.getLength);System.out.println(MRECEIVED:M+sentence);〃猎取该数据报的发送者IP地址InetAddressIPAddress=receivePacket«getAddress;〃猎取该数据报的发送者端□号intport=receivePacketgetPortO;備字符串字符转换为大写StringcapitalizedSentence=sentence.toUpperCase;sendData=capitalizedSentence.getBytes;DatagramPacket对象DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress^port);serverSocket.send(sendPacket) }思考题:在基于l:DP协议的网络程序中,对于数据报文的缓冲区大小的设置,具体会有那些状况〔可能性比较大的〕?选择某种具体状况下,分析合带来哪些实际的编程问题?假设:Client端:接收缓冲为:c.recvbuff;发送缓冲为:c.sendbuff;data_size;
Server谢:接收缓冲为:s_recvbuff;发送缓冲为:s_sendbuff;例如:一种可能的状况与发送数据大小的关系:c_recvbuff=c_sendbuff=s_recvbufT=s_sendbuff>data_size;crecvbuff=csenclbuff=srecvbuff=ssendbuff<datasize;试验要求:java的UDP套接字编写client/server模式网络应含:试验目的:试验任务:试验结果截图:思考题◎答:〔假设有的话〕试验总、结:4NIOTCPEcho客户端及效劳器试验目的:生疏基于java的UDP套接字网络编程万法;生疏UDPClient套接字编程流程;生疏UDPServer套接字编程流程;生疏javaUDPjava类;试验任务:实现一个根本的UDP套接字Clicnt/Scrver模式的网络应用系统.该系统中客户端通过健盘承受用户输入,并将用户输入内容通过UDP协议发送给效劳器端;效劳器端监听网络,承受Echo效劳的效劳器程序。指导说明:1UDP客户端根本编程流程1.1UDP客户端工作流程创立数据报套接字〔邮筒〕,用于发送和接叹数据报;创立发送型DatagramPacket对象〔信封〕,并发送给效劳器;创立接收型DatagramPacket对象〔信封〕,从网络接收效劳器数据:12UDP 客户端完整程序源码例如importjava.io.*;import.*;publicclassSimpleUDPClient{publicstaticvoidinain(Stringargs[])throwsException{〃基于系统输入流构造具有缓冲区的字符流对金,用于接收畫盘输入BufferedReaderinFromUser=newBufferedRea(ler(newInputStreainReader(Systein.in));〃构造数据报套接字DatagramSocketclientsocket=newDatagramSocket;〃预备DatagramPacket对象的地址和数据缓冲区InetAddressIPAddress=InetAddress.getByNanie(Mlocalhostu);byte[]sendData=newbytefl024];bvte[]receiveData=newbyte[1024];while(true){Stringsentence=inFromUsenreadLine;〃从输入终端接收字符卑sendData=sentence.getBytes;〃将字符串以字节形式保存于字节数组中DatagramPacket刘象DatagrainPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,9876);clientsocket.send(sendPacket);//发送数据报DatagramPacket刘象DatagrainPacketreceivePacket=newDatagramPacket(receiveData,receiveData.Iength);clientsocket.receive(receivePacket);//接收UDP协议发送来的数据DatagrainPacket象缓冲区,构造字符串StringmodifiedSentence=newString(receivePacket君etData〃获得缓冲区的字节数组首地址0〃从缓冲区中第一个要读取的字节相对于首地址的偏移■receivePacket.getLength//^际从网络上接收的字节数System.out.println(1*FROMSERVER:u+modifiedSentence);UDP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年温室大棚内植物种植技术服务合同3篇
- 2025年云南货运从业资格证考试题答案大全及解析
- 2025年荆门大车货运资格证考试题
- 2024全新车辆顶账拆分及追偿服务协议5篇
- 2025年河池怎么考货运从业资格证
- 2024年煤矿开发深度合作协议模版版B版
- 《男员工站立时,怎》课件
- 安徽省淮北市五校联考2022-2023学年八年级下学期第一次月考历史试题(解析版)
- 2024年物业服务管理合同(智能化系统)
- 2024年水果订购合同:柑橘专篇
- 县中医院妇科重点专科建设汇报
- 8D报告培训教材
- 资产评估过程中应急预案
- 暂缓执行房产拍卖申请书
- ECFA货物贸易早期收获计划台湾方面降税产品清单(台2011年税则)
- 西方景观设计思潮影响下的遗址公园景观设计实践-以西安环城公园为例的开题报告
- 15D500-15D505 防雷与接地图集(合订本)
- 投标文件澄清通知 澄清函
- 病毒性心肌炎临床路径
- 幼儿园故事课件:《小马过河》
- 注塑机设备点检与保养作业指导书
评论
0/150
提交评论