




免费预览已结束,剩余81页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九讲 网络通信,1、网络基本概念 2、java与internet 3、使用inetaddress 4、使用url 5、socket通信 6、数据报通信,tcp/ip(transmission control protocol传输控制协议/internet protocol网间协议)是internet的主要协议,定义了计算机和外设进行通信所使用的规则。tcp/ip网络参考模型包括五个层次:应用层、传输层、网络层、链路层、物理层。 iso/osi网络参考模型则包括七个层次:应用层、表示层、会话层、传输层、网络层、链路层、物理层。,1、网络基本概念,物理层,大多数基于internet的应用程序被看作tcp/ip网络的最上层应用层, 如:ftp,http,smtp,pop3,telnet,nntp等。 网络层对tcp/ip网络中的硬件资源进行标识。连接到tcp/ip网络中的每台计算机(或其他设备)都有唯一的地址,这就是ip地址。ip地址实质上是一个32位的整数,通常以“%d.%d.%d.%d”的形式表示,每个d是一个8位整数。 在tcp/ip网络中,不同的机器之间进行通信时,数据的传输是由传输层控制的,这包括数据要发往的目标机器及应用程序、数据的质量控制等。 tcp/ip网络中最常用的传输协议就是tcp(transport control protocol)和udp(user datagram protocol)。,1、网络基本概念,一台机器通常只通过一条链路连接到网络上,即它只有一个ip地址,但一台机器中往往有很多应用程序需要进行网络通信,如何区分呢?这就要靠网络端口号(port)了。 端口号是一个标记机器的逻辑通信信道的正整数,端口号不是物理实体。ip地址和端口号组成了所谓的socket,socket是网络上运行的程序之间双向通信链路的最后终结点,它是tcp和udp的基础。,ip与端口号组合而得出的socket,可以完全分辨internet上运行的程序。,1、网络基本概念,端口号是用一个16位的整数来表达的,其范围为065535,其中01023为系统所保留,专门给那些通用的服务(well-known services),如http服务的端口号为80,telnet服务的端口号为23,ftp服务的端口为21,因此,当我们编写通信程序时,应选择一个大于1023的数作为端口号,以免发生冲突。,1、网络基本概念,传输层通常以tcp和udp协议来控制端点到端点的通信。用于通信的端点是由socket来定义的,socket是由ip地址和端口号组成的。 传输控制协议(tcp)是在端点与端点之间建立持续的连接而进行通信。建立连接后,发送端将发送的数据印记了序列号和错误检测代码,并以字节流的方式发送出去;接收端则对数据进行错误检查并按序列顺序将数据整理好,数据在需要时可以重新发送,因此整个字节流到达接收端时完好无缺。这与两个人打电话的情形是相似的。 tcp协议具有可靠性和有序性,并且以字节流的方式发送数据,它通常被称为流通信协议。,1、网络基本概念,与tcp协议不同,用户数据报协议(udp)则是一种无连接的传输协议。利用udp协议进行数据传输时,首先需要将要传输的数据定义成数据报(datagram),在数据报中指明数据所要达到的端点(socket,主机地址和端口号),然后再将数据报发送出去。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有比较高的效率,这与通过邮局发送邮件的情形非常相似。,1、网络基本概念,1、网络基本概念,tcp协议和udp协议各有各的用处。当对所传输的数据具有时序性和可靠性等要求时,应使用tcp协议;当传输的数据比较简单、对时序等无要求时,udp协议能发挥更好的作用,如ping、发送时间数据等。,1、网络基本概念,2、java与internet java中的网络支持,针对网络通信的不同层次,java提供的网络功能有四大类:inetaddress 、urls、sockets、datagram。 inetaddress面向的是网络层(ip层),用于标识网络上的硬件资源。 url面向的应用层,通过url,java程序可以直接送出或读入网络上的数据。 sockets和datagram面向的则是传输层。sockets使用的是tcp协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行通信。datagram则使用udp协议,是另一种网络传输方式,它把数据的目的地纪录在数据包中,然后直接放在网络上。,2、java与internet java中的网络支持,包中的主要的类和可能产生的例外包括: 面向ip层的类:inetaddress (inet4address,inet6address) 面向应用层的类:url、urlconnection 面向网络层的类: tcp协议相关类:socket、serversocket udp协议相关类:datagrampacket、datagramsocket、multicastsocket 可能产生的例外: bindexception、connectexception、malformedurlexception、noroutetohostexception、protocolexception、socketexception、unknownhostexception、unknownserviceexception,类inetaddress可以用于标识网络上的硬件资源,它提供了一系列方法以描述、获取及使用网络资源。 inetaddress类没有构造函数,因此不能用new来构造一个inetaddress实例。通常是用它提供的静态方法来获取: public static inetaddress getbyname(string host) :host可以是一个机器名,也可以是一个形如“%d.%d.%d.%d”的ip地址或一个dsn域名。 public static inetaddress getlocalhost() public static inetaddress getallbyname(string host) public static inetaddress getbyaddress(string host, byte addr) 这些方法通常会产生unknownhostexception例外,应在程序中捕获处理。 以下是inetaddress类的几个主要方法,通过上述方法获得inetaddress类的实例后就可以使用: public byte getaddress():获得本对象的ip地址(存放在字节数组中)。 public string gethostaddress():获得本对象的ip地址“%d.%d.%d.%d”。 public string gethostname():获得本对象的机器名。,3、使用inetaddress,下面的例子演示java如何根据域名自动到dns(域名服务器)上查找ip地址(与dns服务器的连接减至一行): public class getip public static void main(string args) try inetaddress ad=inetaddress.getbyname(““); /inetaddress ad=inetaddress.getlocalhost(); system.out.println(ad); catch(unknownhostexception e) system.out.println(e.tostring(); ,3、使用inetaddress,通过inetaddress,可以获取本机的ip地址: public class gethostname public static void main(string args) try inetaddress ad=inetaddress.getbyname(““); /inetaddress ad=inetaddress.getlocalhost(); system.out.println(“主机名:” + ad.gethostname(); catch(unknownhostexception e) system.out.println(e.tostring(); ,3、使用inetaddress,4、使用url,url是统一资源定位符(uniform resource locator)的简称,它表示internet上某一资源的地址。internet上的资源包括html文件、图象文件、声音文件、动画文件以及其他任何内容(并不完全是文件,也可以是一个对数据库的查询等)。 通过url,就可以访问internet。浏览器或其他程序通过解析给定的url就可以在网络上查找相应的文件或其他资源。,4、使用url,一个url包括两部分内容:协议名称和资源名称,中间用冒号隔开: protocol:resourcename 如: 协议名称指的是获取资源时所使用的应用层协议,如http,ftp,file等;资源名称则是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个应用。当然,并不是所有的url都必须包含这些内容。 /javacourse/index.html /javacourse/techdoc/ch1.ppt :8080/java/network.html#udp,4、使用url 在java中构造url,在包中,提供了类url来表示url。类url提供了很多构造方法来生成一个url对象: public url(string spec) public url(url context, string spec) public url(string protocol, string host, string file) public url(string protocol, string host, int port, string file) 以下是一些具体的构造实例: url url1 = new url(“/map/index.html”); url base = new url(“”); url url2 = new url(base, “mywork1.html”); url url3 = new url(base, “mywork2.html”); url url4 = new url(“http”, “”,“/abc/test.html”); url url5 = new url(“http”, “”, 8080, “/java/network.html”); 另外还有两种稍微复杂些的构造方法(参见jdk文档)。,当创建url时发生错误,系统会产生例外malformedurlexception,这是非运行时例外,必须在程序中捕获处理。 url url1,url2,url3; try url1 = new url(“file:/d:/image/example.gif”); url2 = new url(“/map/”); url3 = new url(url2, “test.gif”); catch(malformedurlexception e) displayerrormessage(); ,4、使用url 在java中构造url,一个url对象生成后,其属性是不能被改变的(与string对象相似),但可以通过它给定的方法来获取这些属性: public string getprotocol():获取该url的协议名 public string gethost() :获取该url的主机名 public string getport() :获取该url的端口号 public string getpath() :获取该url的文件路径 public string getfile() :获取该url的文件名 public string getref() :获取该url在文件中的相对位置 public string getquery() :获取该url的查询名,4、使用url url的基本方法,parseurl.java,4、使用url url连接,通过url类提供的方法openconnection(),就可以获得一个url连接(urlconnection)对象。 public urlconnection openconnection() 通过url的方法openstream(),只能从网络上读取资源中的数据。通过urlconnection类,可以在应用程序和url资源之间进行交互,既可以从url中读取数据,也可以向url中发送数据。urlconnection类表示了应用程序和url资源之间的通信连接。 try url url = new url(“”); urlconnection uc = url.openconnection(); catch(malformedurlexception e1) catch(ioexception e2) ,4、使用url url连接,import .*; import java.io.*; public class readurlfile public static void main(string args) throws ioexception /url url=new url(“/“); url url=new url(“/english/index.jsp“); urlconnection connect=url.openconnection(); bufferedreader buf=new bufferedreader( new inputstreamreader(connect.getinputstream(); bufferedwriter file=new bufferedwriter(new filewriter(“1.txt“); string line; while(line=buf.readline()!=null) system.out.println(line); file.write(line); file.newline(); buf.close(); file.close(); ,urlconnection中最常用的两个方法是: public inputstream getinputstream() public outputstream getoutputstream(),通过urlconnection对象获取的输入流和输出流(不是所有的资源都可以获得有效的输出流),可以与现有的cgi程序进行交互。url和urlconnection的区别在于前者代表一个资源的位置,后者代表一种连接。,4、使用url url连接,outputstream,inputstream,服务器,connection,url url=new url(“/english/index.jsp“); urlconnection connect=url.openconnection(); bufferedreader buf=new bufferedreader( new inputstreamreader(connect.getinputstream();,inputstreamreader,inputstream,bufferedreader,数据,浏览器实例,功能: 一个简单的网页浏览器 实现超级链接事件 技术: 基于jeditorpane显示网页内容,import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.io.*; import .*; public class mybrowser extends jframe jlabel jlabel; jtextfield tf; jeditorpane content; public mybrowser() /界面设计代码 /显示网页代码(略) /事件处理代码(略) public static void main( string args ) mybrowser mb= new mybrowser(); ,super( “我的浏览器“ ); container con = getcontentpane(); /创建标签和文本框对象,并将他们添加到面板中,面板添加到程序窗口的北面 jlabel=new jlabel( “输入连接的网址“); tf = new jtextfield(“); tf.addactionlistener(new myfielddealing(); jpanel panel=new jpanel() ; panel.setlayout(new gridlayout(2,1); panel.add(jlabel); panel.add(tf); con.add(panel, borderlayout.north ); content = new jeditorpane();/创建一个jeditorpane对象用来显示网页内容 content.seteditable( false );/设置可编辑为false,以响应超链接事件 content.addhyperlinklistener(new myhyperlistener();/对content增加超链接监听 con.add( new jscrollpane( content), borderlayout.center ); setdefaultcloseoperation( jframe.exit_on_close ); setsize( 400, 300 ); setvisible( true );,界面设计代码,/自定义方法,用来显示指定网址的网页内容 void getthepage( string site) try content.setpage(site);/设置参数网址site的内容显示在content中 catch ( ioexception ex ) joptionpane.showmessagedialog( this, “连接错误“, “错误提示“, joptionpane.error_message ); ,显示网页内容的代码,class myfielddealing implements actionlistener/处理文本框回车事件 public void actionperformed( actionevent e ) string str=tf.gettext(); getthepage(str);/调用自定义方法显示网页内容 class myhyperlistener implements hyperlinklistener/处理超链接事件 public void hyperlinkupdate( hyperlinkevent e) if ( e.geteventtype() =hyperlinkevent.eventtype.activated ) string str= e.geturl().tostring();/得到超链接事件的网页 getthepage(str);/显示超链接指向的网页 ,事件处理代码,问题:对html、css支持不好,页面布局错位等。,实现java网页浏览器的其他方法,使用开源桌面组件jdic(jdesktop integration components) 网址:/ 参考代码见下页:,import java.awt.borderlayout; import java.awt.event.*; import .malformedurlexception; import .url; import java.util.logging.level; import java.util.logging.logger; import javax.swing.*; import org.jdesktop.jdic.browser.iwebbrowser; import org.jdesktop.jdic.browser.webbrowser; import org.jdesktop.jdic.browser.webbrowserevent; import org.jdesktop.jdic.browser.webbrowserlisteneradapter; public class test1 extends jpanel implements actionlistener private jtextfield input; private jbutton go; private iwebbrowser web; public test1() super(new borderlayout(); initwindow(); private void initwindow() try web = new webbrowser(); web.addwebbrowserlistener(new mylistener(); go = new jbutton(“转到“); input = new jtextfield(); jpanel up = new jpanel(new borderlayout(); up.add(input, borderlayout.center); up.add(go, borderlayout.east); this.add(up, borderlayout.north); this.add(web.ascomponent(), borderlayout.center); input.addactionlistener(this); go.addactionlistener(this); catch (exception ex) logger.getlogger(test1.class.getname().log(level.severe, null, ex); jframe jf = new jframe(“java浏览器“); jf.add(this, borderlayout.center); jf.setsize(500, 300); jf.setlocationrelativeto(null); jf.setvisible(true); jf.setdefaultcloseoperation(jframe.exit_on_close); ,public void actionperformed(actionevent ae) doopen(); private void doopen() try string text = input.gettext(); if (text = null | text.equals(“) return; if (!text.tolowercase().startswith(“http:/“) text = “http:/“ + text; web.seturl(new url(text); catch (malformedurlexception ex) logger.getlogger(test1.class.getname().log(level.severe, null, ex); public static void main(string args) new test1(); private class mylistener extends webbrowserlisteneradapter private mylistener() override public void documentcompleted(webbrowserevent arg0) system.out.println(“文档下载完。“); web.executescript(“alert(文档下载完毕!)“); / web.setcontent(“hello world!“ + / “点我“); / web.removewebbrowserlistener(this); ,实现java网页浏览器的其他方法,/ java实现的浏览器开源项目,5、socket通信,在java中,基于tcp协议实现网络通信的类有两个:在客户端的socket类和在服务器端的serversocket类。 在服务器端通过指定一个用来等待的连接的端口号创建一个 serversocket实例。 在客户端通过规定一个主机和端口号创建一个 socket实例,连到服务器上。 serversocket类的accept方法使服务器处于阻塞状态,等待用户请求。,构造方法: public socket(string host, int port) /远程服务器ip及响应端口 public socket(inetaddress address, int port) public socket(string host, int port, inetaddress localaddr, int localport) public socket(inetaddress address, int port, inetaddress localaddr, int localport) /在指定的机器上的指定端口上运行 这些方法都将抛出例外ioexception,程序中需要捕获处理。,5、socket通信 类socket,socket的输入/输出流管理 public inputstream getinputstream() public void shutdowninput() public outputstream getoutputstream() public void shutdownoutput() 这些方法都将抛出例外ioexception,程序中需要捕获处理。 关闭socket public void close() throws ioexception 设置/获取socket数据 public inetaddress getinetaddress()、public int getport(), public void setsotimeout(int timeout), 这些方法都将抛出例外socketexception,程序中需要捕获处理。,5、socket通信 类socket,构造方法: public serversocket(int port) public serversocket(int port, int backlog) /支持指定数目的连接 public serversocket(int port, int backlog, inetaddress bindaddr) /在指定的机器上运行 这些方法都将抛出例外ioexception,程序中需要捕获处理。 主要方法 public socket accept():等待客户端的连接 public void close():关闭socket 设置/获取socket数据 public inetaddress getinetaddress()、public int getlocalport(), public void setsotimeout(int timeout), 这些方法都将抛出例外socketexception,程序中需要捕获处理。,5、socket通信 类serversocket,5、socket通信,无论一个socket通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的,都包括以下四个基本步骤: 1、在客户方和服务器方创建socket/serversocket实例。 2、打开连接到socket的输入/输出流。 3、利用输入/输出流,按照一定的协议对socket进行读/写操作。 4、关闭输入/输出流和socket。 通常,程序员的主要工作是针对所要完成的功能在第3步进行编程,第1、2、4步对所有的通信程序来说几乎都是一样的。,5、socket通信,5、socket通信,1、建立socket 在客户端: try socket client = new socket(host, 4444); catch(ioexception e) 在服务器端: try serversocket server = new serversocket(4444); catch(ioexception e) socket socket = null; try socket = server.accept(); /等待客户端连接 catch(ioexception e),bufferedreader = new bufferedreader( new inputstreamreader( socket.getinputstream() ) ); bufferedwriter = new bufferedwriter( new inputstreamwriter( socket.getoutputstream() ) );,2、在客户端和服务器端同时打开输入/输出流 类socket提供了方法getinputstream()和getoutputstream()来得到socket对应的输入/输出流以进行数据读写(传输)操作,它们分别返回inputstream对象和outputstream对象。 为了便于读写数据,应在返回的输入/输出流对象上建立过滤流,如datainputstram/dataoutputstram、bufferedinputstream/ bufferedoutputstream、printstream;inputstreamreader/ outputstreamwriter、bufferedreader/ bufferedwriter、printwriter等。,5、socket通信,3、关闭输入/输出流和socket 在客户端和服务器端分别关闭输入/输出流和socket:先关闭所有相关的输入/输出流,再关闭socket。,5、socket通信,5、socket通信,client.java,看看这个谈话程序的运行效果:,2、客户端,server.java,1、服务器端,5、socket通信,import java.io.*; import .*; public class server public static void main(string args) try system.out.println(“建立并等待连接“); serversocket serversocket = new serversocket(5500); socket connecttoclient = serversocket.accept(); datainputstream infromclient = new datainputstream( connecttoclient.getinputstream(); dataoutputstream outtoclient = new dataoutputstream( connecttoclient.getoutputstream(); string str; double radius; while (true) str = infromclient.readutf(); if(str.equals(“bye“) outtoclient.writeutf(“bye“); break; radius = double.parsedouble(str); system.out.println(“从客户端接收的半径: “ + radius); double area = radius*radius*math.pi; double volume=4*math.pi*radius*radius*radius/3; string s=“半径为“+radius+“圆的面积“+area +“n半径为“+radius+“球的体积“+volume; outtoclient.writeutf(s); outtoclient.flush(); system.out.println(“结果已求出并发送到客户: “); infromclient.close(); outtoclient.close(); serversocket.close(); catch(ioexception e) e.printstacktrace(); ,import java.io.*;import .*; public class client public static void main(string args) try / 创建一个客户端socket对象,连接到服务器的5500端口 socket connecttoserver = new socket(“localhost“, 5500); datainputstream infromserver = new datainputstream(connecttoserver.getinputstream(); dataoutputstream outtoserver =new dataoutputstream(connecttoserver.getoutputstream(); system.out.println(“#输入的半径发送到服务器。“); system.out.println(“#输入bye,则终止连接。“); string s; while (true) system.out.print(“请输入半径: “); bufferedreader br = new bufferedreader( new inputstreamreader(system.in); s=br.readline(); outtoserver.writeutf(s); outtoserver.flush(); string s1 = infromserver.readutf(); if(s1.equals(“bye“) break; system.out.println(“从服务器返回的计算结果:“); system.out.println(s1); system.out.println(); infromserver.close(); outtoserver.close(); connecttoserver.close(); catch (ioexception e) e.getstacktrace(); ,5、socket通信 简单的client/server,在本地机器上测试网络程序用回绕地址 socket socket = new socket(“”, 5500); 建立socket连接后,还应该建立输入输出数据流。 在运行时,服务器端程序一般应先行启动。,解决方案一: 在一台计算机上一次启动多个服务器程序,只要端口号不同。 myserver1 myclient1 myserver2myclient2,5、socket通信 支持多client,解决方案二: 将服务器写成多线程的,不同的处理线程为不同的客户服务。主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。 /主线程 while (true) 等待连接; 创建线程; end while,5、socket通信 支持多client,/ multiserver.java import java.io.*; import .*; public class multiserver public static void main(string args) throws ioexception system.out.println(“建立并等待连接“); serversocket serversocket = new serversocket(5500); socket connecttoclient=null; while(true) connecttoclient = serversocket.accept(); new serverthread(connecttoclient); ,多线程版本:,/ serverthread.java import java.io.*; import .*; public class serverthread extends thread private socket connecttoclient;/定义套接字对象 private datainputstream infromclient;/从套接字读取数据 private dataoutputstream outtoclient;/向套接字中输出数据 /初始化并启动线程 public serverthread(socket socket) throws ioexception connecttoclient=socket; infromclient = new datainputstream( connecttoclient.getinputstream(); outtoclient = new dataoutputstream( connecttoclient.getoutputstream(); start();/启动线程,将执行run方法 /run方法 ,public void run()/线程启动后将执行该方法 try string str; double radius; while (true) str = infromclient.readutf();/从套接字中读取字符串 if(str.equals(“bye“)/如果是字符串则断开连接 outtoclient.writeutf(“bye“); break; radius = double.parsedouble(str); system.out.println(“接收到半径值: “+ radius); double area = radius*radius*math.pi; double volume=4*math.pi*radius*radius*radius/3; string s=“半径为“+radius+“圆的面积“+area +“n半径为“+radius+“球的体积“+volume; outtoclient.writeutf(s); outtoclient.flush(); system.out.println(“计算结果已发送给客户。“); infromclient.close(); outtoclient.close(); connecttoclient.close(); catch(ioexception e) e.printstacktrace(); ,udp协议是无连接的协议,它以数据报作为数据传输的载体。数据报是一个在网络上发送的独立信息,它的到达、到达时间以及内容本身等都不能得到保证。数据报的大小是受限制的,每个数据报的大小限定在64kb以内。 udp协议无需在发送方和接收方建立连接,但也可以先建立连接。数据报在网上可以以任何可能的路径传往目的地。 在java中,基于udp协议实现网络通信的类有三个: 用于表达通信数据的数据报类datagrampacket 用于进行端到端通信的类datagramsocket 用于广播通信的类multicastsocket。,6、数据报通信,构造方法 public datagrampacket(byte buf, int length) public datagrampacket(byte buf, int offset, int length) /这两个方法用于描述接收数据报 public datagrampacket(byte buf, int length, inetaddress address, int port) public datagrampacket(byte buf, int offset, int length, inetaddr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州台江县民族中医院第二次招聘备案制专业技术人员考前自测高频考点模拟试题完整答案详解
- 广清市质量安全培训课件
- 2025福建福州市鼓楼区拟任命人民陪审员模拟试卷及答案详解(名师系列)
- 安全培训教师介绍词简短课件
- 2025江苏泰州学院招聘专职辅导员和专任教师17人考前自测高频考点模拟试题及1套参考答案详解
- 2025年第十三届贵州人才博览会省委金融办所属事业单位人才引进1人模拟试卷及答案详解(名师系列)
- 2025年非金属矿物制品:耐火项目建议书
- 2025国网冀北电力有限公司第二批高校毕业生录用人选的模拟试卷及完整答案详解1套
- 2025江苏连云港市金灌投资发展集团有限公司、灌南城市发展集团有限公司等招聘34人模拟试卷及参考答案详解
- 2025湖州安吉县城市建设投资集团有限公司下属子集团招聘11人考前自测高频考点模拟试题含答案详解
- 23G409先张法预应力混凝土管桩
- BA系统原理培训课件
- 上海交通大学学生生存手册
- 民航安全检查员(四级)理论考试题库(浓缩500题)
- 热力管网监理实施细则
- FMEA-潜在失效模式分析
- 统编版高中语文选择性必修上册第一单元测试卷【含答案】
- 保健食品注册与备案管理办法课件
- 钢筋锈蚀原理及应对措施案例分析(54页图文丰富)
- 第二讲水轮机结构
- K2FastWave中文操作手册
评论
0/150
提交评论