版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第九章 Java网络编程基础,贺 玉 珍 ,计算机科学与技术系,2,主要内容,网络编程基本概念 Java网络基本类 Java网络Socket编程(基于TCP协议的C/S网络编程)(下载源码就到源码网),计算机科学与技术系,3,计算机科学与技术系,9.1 网络编程基本概念,网络编程:利用操作系统在不同通信协议层次上提供的接口(系统调用、库函数)实现网络进程的安全通信。 网络进程:就是网点机(连入网络的计算机)上运行的程序。网络进程在通信协议中用端口(port)标识,而它驻留的网点机则用其IP地址或域名来标识。 网络编程中有两个主要的问题: 如何准确的定位网络上一台或多台主机, 找到主机后如何
2、可靠高效的进行数据传输。 网络编程模型:是客户机/服务器(C/S)结构。,4,9.1 网络编程基本概念,IP地址:标识计算机等网络设备的网络地址,由四个8位的二进制数组成,中间以小数点分隔。如:, 0 主机名(hostname):网络地址的助记名,按照域名进行分级管理。 如: 服务类型(service):网络的各种服务。 如:web服务, ftp服务, smtp服务, Telnet服务等,计算机科学与技术系,5,计算机科学与技术系,端口(Port):指TCP/IP协议中的端口,是逻辑意义上的概念。主机上每一个提供服务的程序都运行在该主机的一个对
3、外开放的端口上。程序员可以在创建自己的服务程序时使用自定义的端口,通过这个端口号来连接服务进程以接收服务。 如果把IP地址比作一间房子 ,端口就是出入这间房子的门。,端口常以16位无符号整数编号(0-65535)。 保留端口(0-1023)和动态端口(1024-65535)。 一个端口与使用该端口的服务进程是对应的。,9.1 网络编程基本概念,6,TCP/IP协议(TCP和UDP):,四层机构:物理层、网络层、传输层、应用层 协议:IP、TCP、UDP、HTTP、FTP、SMTP等 TCP:面向连接的服务。可靠,传输大小无限制,但是需要连接建立时间,差错控制开销大。 比如打电话 UDP,无连接
4、的服务。不可靠,差错控制开销较小,传输大小限制在64K以下,不需要建立连接。 比如写信,9.1 网络编程基本概念,7,8,9.2.1 包,InetAddress类 URL类 URLConnection类 套接字类 DatagramPacket类,9.2 Java网络基本类,计算机科学与技术系,Socket类、ServerSocket类 DatagramSocket类,9,9.2.2 InetAddress类,计算机科学与技术系,是描述Internet地址的类。 常用方法: UnknownHostException异常,9.2 Java网络基本类,static InetAddress getLo
5、calHost(); 返回本地主机。 static InetAddress getByName(String host); 在给定主机名的情况下确定主机的 IP 地址。 String getHostAddress(); /获得IP地址 String getHostName(); /获得主机名,10,9.2.2 InetAddress类,9.2 Java网络基本类,例1:利用InetAddress类获取本机的IP地址。 GetLocalHost.java,计算机科学与技术系,import .*; import java.io.*; public class GetLocalHost public
6、 static void main(String args) InetAddress myIp = null; String ip, hostname; try myIp = InetAddress.getLocalHost(); System.out.println(myIp); ip = myIp.getHostAddress(); /获得IP地址 System.out.println(ip); hostname = myIp.getHostName(); /获得主机名 System.out.println(hostname); catch(UnknownHostException e)
7、,11,计算机科学与技术系,9.2.2 InetAddress类,9.2 Java网络基本类,例2:根据域名自动到DNS服务器上查找IP地址 。 GetInetAddress.java,import .*; public class GetInetAddress public static void main(String args) throws UnknownHostException String host = “; if(args.length = 1) host = args 0; InetAddress ia = InetAddress.getByName(host); Syste
8、m.out.println(ia); System.out.println(Canonical Host Name = + ia.getCanonicalHostName(); /从域名服务器中获得标准的主机名 System.out.println(Host Address = + ia.getHostAddress(); System.out.println(Host Name = + ia.getHostName(); ,12,计算机科学与技术系,9.2.3 套接字Socket,套接字:是进程之间通信的抽象连接点。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
9、 在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP /IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 TCP/IP协议和Socket之间是没有必然联系的。 一个Socket由一个IP地址和一个端口号唯一确定。,9.2 Java网络基本类,13,计算机科学与技术系,9.2.3 套接字Socket,两个网络进程采用套接字方式通信(基于TCP协议)时,因扮演的角色不同,它们使用的套接字也不同。 客户端Socket和服务器端ServerSocket 流套接字和数据报套接字,9.2 Java网络基本类,流套接字提供了
10、双向的、有序的、无重复并且无记录边界的数据流服务。流套接字依靠TCP协议来保证信息正确到达目的地。 数据报套接字支持双向的数据流,但并不保证是可靠、有序、无重复的。UDP是数据报套接字协议。,14,计算机科学与技术系, Socket类 Socket类提供的主要方法有:,构造方法: UnknownHostException和IOException异常,9.2 Java网络基本类,Socket(String host, int port) Socket(InetAddress address, int port),InetAddress getInetAddress() int ge
11、tPort() void close() InputStream getInputStream() OutputStream getOutputStream(),15, ServerSocket类,计算机科学与技术系,构造方法: IOException异常 count表示对该ServerSocket实体对象与端口间的连接进行监听的次数。,9.2 Java网络基本类,ServerSocket(int port) ServerSocket(int port,int count),16, ServerSocket类,计算机科学与技术系,ServerSocket类提供的主要
12、方法有:,9.2 Java网络基本类,Socket accept() throws IOException void close(),/*服务方等待连接,该方法将阻塞当前服务线程,直到连接成功。该方法返回一个新的Socket类对象,通过该套接字对象,与连接的客户进行通信。 */,17,9.3.1 Socket编程,计算机科学与技术系,在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。 目前较为流行的网络编程模型是客户机/服务器(C/S)结构。,9.3 使用TCP协议的Socket网络编程,C/S结构,即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时
13、向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。,18,9.3.2 Socket程序设计 (一对一通),计算机科学与技术系,Server端程序设计的基本步骤:,9.3 使用TCP协议的Socket网络编程,创建ServerSocket对象。 (调用accept()方法)等待接收客户方的连接请求。如无则服务器方一直阻塞,否则返回一个Socket对象。 构造数据输入输出流对象,接收客户消息、发送响应消息。 关闭输入输出流及Socket。,19,9.3.2 Socket程序设计的
14、基本步骤,计算机科学与技术系,Client端程序设计的基本步骤:,9.3 使用TCP协议的Socket网络编程,创建指向一个服务器固定端口的Socket对象,建立与服务器的连接。 构造数据输入输出流对象,发送请求消息,接收响应消息。 关闭输入输出流及Socket。,20,9.3.3 Socket编程示例,计算机科学与技术系,例3:编程实现客户端可以接收看到服务端传来的问候语“Welcome!”,然后在客户端通过键盘输入字符,传送给服务器端,服务器接受并端显示出来,直到客户在客户端输入“quit”,双方结束通讯。客户方与服务器方在同一主机上。,9.3 使用TCP协议的Socket网络编程,21,
15、计算机科学与技术系,服务方源程序:TcpServer.java,9.3 使用TCP协议的Socket网络编程,Socket编程示例,/package TcpSocketDemo; /服务方源程序TcpServer.java import java.io.*; import .*; public class TcpServer public static void main(String args) throws IOException ServerSocket svrsoc = null; Socket soc = null; InputStream is = null; OutputStre
16、am os = null; PrintStream out = null; try svrsoc = new ServerSocket(8000); soc = svrsoc.accept(); /服务者等待一个连接 is = soc.getInputStream(); /获得输入流对象 InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr);,22,计算机科学与技术系,服务方源程序:TcpServer.java,7.3 使用TCP协议的Socket网络编程,7
17、.3.3 Socket编程示例,os = soc.getOutputStream(); /获得输出流对象 out = new PrintStream(os); InetAddress clientIP = soc.getInetAddress(); /得客户方IP System.out.println(Clients IP address: + clientIP); int port; port = soc.getPort(); /得到客户方的端口 System.out.println(Clients port: + port); out.println(“Welcome!.”); /通过输出
18、流out向客户方传送信息 String str = br.readLine(); /通过输入流in从客户方读信息 while(!str.equals(quit) /如读出的不是“quit”,继续读 System.out.println(Client said: + str); str = br.readLine(); System.out.println(Client want to leave.); catch(Exception e) System.out.println(Error: + e); finally is.close(); os.close(); soc.close(); ,
19、23,计算机科学与技术系,服务方源程序:TcpServer.java,7.3 使用TCP协议的Socket网络编程,7.3.3 Socket编程示例,/package TcpSocketDemo; /客户方源程序TcpClient.java import java.io.*; import .*; public class TcpClient public static void main(String args) throws IOException Socket soc = null; InputStream is = null; OutputStream os = null; Print
20、Stream out = null; String strin = null; try soc = new Socket(“localhost”, 8000); /建立Socket对象,并与服务器方建立连接 System.out.println(Connecting to the Server.); is = soc.getInputStream(); /获得输入流对象 os = soc.getOutputStream(); /获得输出流对象,24,计算机科学与技术系,服务方源程序:TcpServer.java,7.3 使用TCP协议的Socket网络编程,7.3.3 Socket编程示例,I
21、nputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); out = new PrintStream(os); strin = br.readLine(); /通过输入流从服务方读取内容 System.out.println(Server said: + strin); byte bmsg = new byte20; System.in.read(bmsg); /从标准输入键盘上读取内容 String msg = new String(bmsg); msg = m
22、sg.trim(); /trim()方法是去掉字符串中前尾的空白字符,25,计算机科学与技术系,服务方源程序:TcpServer.java,7.3 使用TCP协议的Socket网络编程,7.3.3 Socket编程示例,while(!msg.equals(quit) out.println(msg); /把从键盘上读取的内容msg通过输出流out输出给服务方 System.in.read(bmsg); /从键盘上继续读内容入bmsg中 msg = new String(bmsg); /把读入的内容转换成字符串 msg = msg.trim(); out.println(msg); catch(
23、Exception e) System.out.println(Error: + e); finally is.close(); /关闭输入流 os.close(); /关闭输出流 soc.close(); /关闭Socket对象soc ,26,9.3.4 注意事项,计算机科学与技术系,服务方和客户方各自的编程步骤。 客户方输出流的数据宿是服务方输入流的数据源。而服务方输出流的数据宿是客户方输入流的数据源。 注意trim()方法的使用。 异常的捕获处理。,9.3 使用TCP协议的Socket网络编程,27,例4 import java.io.*; import .*; import java.
24、awt.*; import java.awt.event.*; public class SocketServerExample extends Frame implements ActionListener Label label=new Label(输入聊天信息); TextField tf= new TextField(20); TextArea ta=new TextArea( ); Panel panel=new Panel( );/创建面板对象 ServerSocket server; Socket Client; InputStream DataIn; OutputStream
25、DataOut; public SocketServerExample( ) super(这里是服务器); setSize(300,180); panel.add(label);/在面板上添加标签 panel.add(tf);/在面板上添加文本框 tf.addActionListener(this);/注册 add(North,panel);/在窗体上添加面板 add(Center,ta);/在窗体上添加文本区 addWindowListener(new WindowAdapter( ) public void windowClosing(WindowEvent e) System.exit(
26、0);); show( );,28,try server =new ServerSocket(5000); Client=server.accept( ); ta.append(已经和客户机连接:+Client.getInetAddress( ).getHostName( )+nn); DataIn=Client.getInputStream( ); DataOut=Client.getOutputStream( ); catch(IOException ioe) while(true) try byte buff =new byte512;/缓冲数组 DataIn.read(buff); S
27、tring str=new String(buff);/接受客户端发送的数据包 ta.append(客户机说:+str+n); catch(IOException ioe) ,29,public static void main(String args ) new SocketServerExample( ); public void actionPerformed(ActionEvent e)/事件处理程序 try String str=new String(tf.getText(); byte buf =str.getBytes( ); tf.setText( ); DataOut.wri
28、te(buf); ta.append(服务器说:+str+n); catch(IOException ioe) ,30,import java.io.*; import .*; import java.awt.*; import java.awt.event.*; public class SocketClientExample extends Frame implements ActionListener Label label=new Label(输入聊天信息); TextField tf= new TextField(20); TextArea ta=new TextArea( ); P
29、anel panel=new Panel( );/创建面板对象 Socket Client; InputStream DataIn; OutputStream DataOut; public SocketClientExample( ) super(这里是客户机); setSize(300,180); panel.add(label);/在面板上添加标签 panel.add(tf);/在面板上添加文本框 tf.addActionListener(this); /注册 add(North,panel);/在窗体上添加面板 add(Center,ta);/在窗体上添加文本区 addWindowLi
30、stener(new WindowAdapter( ) public void windowClosing(WindowEvent e) System.exit(0);); show( );,31,try Client=new Socket(InetAddress.getLocalHost( ),5000); ta.append(已经和服务器连接:+Client.getInetAddress( ).getHostName( )+nn); DataIn=Client.getInputStream( ); DataOut=Client.getOutputStream( ); catch(IOExc
31、eption ioe) while(true) try byte buff =new byte512;/缓冲数组 DataIn.read(buff); String str=new String(buff);/接受客户端发送的数据包 ta.append(服务器说:+str+n); catch(IOException ioe) ,32,public static void main(String args ) new SocketClientExample( ); public void actionPerformed(ActionEvent e) /事件处理程 try String str=n
32、ew String(tf.getText(); byte buf =str.getBytes( ); tf.setText( ); DataOut.write(buf); ta.append(客户机说:+str+n); catch(IOException ioe) ,33,计算机科学与技术系,UDP协议,适合用于很强的实时交互性的场合,如网络游戏,视频会议等。 数据报(Datagram),就跟日常生活中的邮件系统一样,是不能保证可靠的寄到的,而面向链接的TCP就好比电话,双方能肯定对方接受到了信息。 包中提供了两个类DatagramSocket类和DatagramPacket类用来支持数据报通
33、信。,9.4 使用UDP协议的Socket网络编程,9.4.1 UDP协议,选修,34,计算机科学与技术系,用于在程序之间建立传送数据报的通信连接。 构造方法: 其中,port指明socket所使用的端口号,如果未指明端口号,则把socket连接到本地主机上一个可用的端口。给出端口号时要保证不发生端口冲突,否则会生成SocketException类异常。,9.4 使用UDP协议的Socket网络编程,9.4.2 DatagramSocket类,DatagramSocket(); DatagramSocket(int port); DatagramSocket(int port, InetAdd
34、ress laddr);,35,计算机科学与技术系,用来表示一个数据报。 构造方法: 其中,buf中存放数据报数据,length为数据报中数据的长度,addr和port指明数据报被送往的目的地址和端口,offset指明了从指定的位移量位置传输数据报。,9.4 使用UDP协议的Socket网络编程,9.4.3 DatagramPacket类,DatagramPacket(byte buf,int length); DatagramPacket(byte buf, int length, InetAddress addr, int port); DatagramPacket(byte buf, i
35、nt offset, int length); DatagramPacket(byte buf, int offset, int length, InetAddress address, int port);,36,计算机科学与技术系,Server端程序设计的基本步骤:,9.4 使用UDP协议的Socket网络编程,9.4.4 基于UDP的Socket编程的基本步骤,构建DatagramSocket对象。 构建DatagramPacket对象, 使用DatagramPacket(byte buf,int length)构造方法,给出接收数据的缓冲区及其长度。 调用DatagramSocket的
36、方法receive()等待数据报的到来。 receive()将一直等待,直到收到一个数据报为止。,37,计算机科学与技术系,Client端程序设计的基本步骤:,9.4 使用UDP协议的Socket网络编程,9.4.4 基于UDP的Socket编程的基本步骤,构建DatagramSocket对象。 构建DatagramPacket对象,使用DatagramPacket(byte buf, int length, InetAddress addr, int port)构造方法,在给出存放发送数据的缓冲区的同时,还要给出完整的目的地址(包括IP地址和端口号) 。 调用DatagramSocket的方
37、法send()发送数据。send()根据数据报的目的地址来寻径,以传递数据报。,38,import java.io.IOException; import .*; public class UdpSend public static void main(String agrs) DatagramSocket ds = null; try ds = new DatagramSocket(); catch (SocketException e) e.printStackTrace(); String info=hello world ; DatagramPacket dp = null; try
38、dp = new DatagramPacket(info.getBytes(),info.getBytes().length,InetAddress.getLocalHost(), 7000); catch (UnknownHostException e1) e1.printStackTrace(); try ds.send(dp); catch (IOException e) e.printStackTrace(); ds.close(); ,39,import java.io.IOException; import .*; public class UdpReceive public st
39、atic void main(String args) DatagramSocket ds; ds = null; try ds=new DatagramSocket(7000); catch (SocketException e) e.printStackTrace(); byte buff=new byte1024; DatagramPacket dp=new DatagramPacket(buff,1024); try ds.receive(dp); catch (IOException e) e.printStackTrace(); String info=new String(dp.
40、getData(),0,dp.getLength() +dp.getAddress() +dp.getSocketAddress(); System.out.println(info); ds.close(); ,40,计算机科学与技术系,用数据报方式编写client/server程序的实例:,9.4 使用UDP协议的Socket网络编程,9.4.5 基于UDP的Socket编程示例,构建一个基于UDP的C/S 网络传输模型:,41,计算机科学与技术系,用数据报方式编写client/server程序的实例:,7.4 使用UDP协议的Socket网络编程,7.4.5 基于UDP的Socket编程
41、示例,构建一个基于UDP的C/S 网络传输模型:,/客户方源程序Client.java package UDPSocketDemo; import java.io.*; import .*; import java.util.*; public class Client public static void main(String args) throws IOException if(args.length != 1) /如果启动的时候没有给出Server的名字,那么出错退出 System.out.println(“Usage:java QuoteClient ”); /输出出错信息 ret
42、urn; /返回 DatagramSocket socket = new DatagramSocket(); /创建数据报套接字 byte buf = new byte256; /创建缓冲区,42,计算机科学与技术系,用数据报方式编写client/server程序的实例:,7.4 使用UDP协议的Socket网络编程,7.4.5 基于UDP的Socket编程示例,构建一个基于UDP的C/S 网络传输模型:,InetAddress address = InetAddress.getByName(args0); /*由命令行给出的第一个参数默认为Server的名字, 通过它得到Server的IP信
43、息。*/ DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445); /创建DatagramPacket对象 socket.send(packet); /发送 packet = new DatagramPacket(buf, buf.length); /创建新的DatagramPacket对象,用来接收数据报 socket.receive(packet); /接收 String received = new String(packet.getData(); /根据接收到的字节数组生成相应的字符串 Sys
44、tem.out.println(Quote of the Moment:” + received ); /打印生成的字符串 socket.close(); /关闭套接字 ,43,计算机科学与技术系,用数据报方式编写client/server程序的实例:,7.4 使用UDP协议的Socket网络编程,7.4.5 基于UDP的Socket编程示例,构建一个基于UDP的C/S 网络传输模型:,/服务方源程序Server.java package UDPSocketDemo; import java.io.*; import .*; import java.util.*; public class S
45、erver public static void main(String args) throws java.io.IOException new ServerThread().start(); /启动一个ServerThread线程 ,44,计算机科学与技术系,用数据报方式编写client/server程序的实例:,7.4 使用UDP协议的Socket网络编程,7.4.5 基于UDP的Socket编程示例,构建一个基于UDP的C/S 网络传输模型:,/服务线程源程序ServerThread.java package UDPSocketDemo; import java.io.*; impor
46、t .*; import java.util.*; public class ServerThread extends Thread /服务器线程 protected DatagramSocket socket = null; /记录和本对象相关联的DatagramSocket对象 protected BufferedReader in = null; /用来读文件的一个Reader protected boolean moreQuotes=true; /标志变量,是否继续操作 public ServerThread() throws IOException /重载无参数的构造函数 this(
47、“ServerThread”); /以QuoteServerThread为默认值调用带参数的构造函数 ,45,计算机科学与技术系,用数据报方式编写client/server程序的实例:,7.4 使用UDP协议的Socket网络编程,7.4.5 基于UDP的Socket编程示例,构建一个基于UDP的C/S 网络传输模型:,public ServerThread(String name) throws IOException /重载有参构造函数 super(name); /调用父类的构造函数 socket = new DatagramSocket(4445); /在端口4445创建数据报套接字 t
48、ry in = new BufferedReader(new FileReader( one-liners.txt); /打开一个文件,构造相应的BufferReader对象 catch(FileNotFoundException e) System.err.println(Could not open quote file. Serving time instead.); /打印出错信息 ,46,计算机科学与技术系,用数据报方式编写client/server程序的实例:,7.4 使用UDP协议的Socket网络编程,7.4.5 基于UDP的Socket编程示例,构建一个基于UDP的C/S 网
49、络传输模型:,public void run() /线程主体 while(moreQuotes) try byte buf = new byte256; /创建缓冲区 DatagramPacket packet = new DatagramPacket(buf, buf.length); /由缓冲区构造DatagramPacket对象 socket.receive(packet); /接收数据报 String dString = null; if( in = null ) dString = new Date().toString(); /如果初始化的时候打开文件失败了,则使用日期作为要传送的
50、字符串 else dString = getNextQuote(); /否则调用成员函数从文件中读出字符串 buf = dString.getByte(); /把String转换成字节数组,以便传送,47,计算机科学与技术系,用数据报方式编写client/server程序的实例:,7.4 使用UDP协议的Socket网络编程,7.4.5 基于UDP的Socket编程示例,构建一个基于UDP的C/S 网络传输模型:,InetAddress address = packet.getAddress(); /从Client端传来的Packet中得到Client地址 int port = packet.
51、getPort(); /和端口号 packet = new DatagramPacket(buf,buf.length,address,port); /根据客户端信息构建DatagramPacket socket.send(packet); /发送数据报 catch(IOException e) e.printStackTrace(); /打印错误栈 moreQuotes = false; /标志变量置false,以结束循环 socket.close(); /关闭数据报套接字 ,48,计算机科学与技术系,用数据报方式编写client/server程序的实例:,7.4 使用UDP协议的Socke
52、t网络编程,7.4.5 基于UDP的Socket编程示例,构建一个基于UDP的C/S 网络传输模型:,protected String getNextQuotes() /成员方法,从文件中读数据 String returnValue = null; try if(returnValue = in.readLine() = null ) /从文件中读一行,如果读到了文件尾 in.close( ); /关闭输入流 moreQuotes = false; /标志变量置false,以结束循环 returnValue = No more quotes. Goodbye.; /置返回值 /否则返回字符串即
53、为从文件读出的字符串 catch(IOException e) returnValue = IOException occurred in server; /置异常返回值 return returnValue; /返回字符串 ,49,计算机科学与技术系,实例分析: 使用UDP和使用TCP在程序上有一个比较明显的区别:,9.4 使用UDP协议的Socket网络编程,9.4.5 基于UDP的Socket编程示例,UDP的Socket编程是不提供监听功能的,也就是说通信双方更为平等,面对的接口是完全一样的。 但是为了用UDP实现C/S结构,在使用UDP时可以使用DatagramSocket.receive()来实现类似于监听的功能。因为receive()是阻塞的函数,当它返回时,缓冲区里已经填满了接受到的一个数据报,并且可以从该数据报得到发送方的各种信息,这一点跟accept()是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公建用房智能化工程施工方案
- 特区建工集团2026届春季校园招聘备考题库及参考答案详解【夺分金卷】
- 2026天津市安定医院招聘第三批派遣制人员3人备考题库及完整答案详解(名校卷)
- 售后维修责任保证承诺书8篇
- 2026江西南昌市西湖区图书馆招聘1人备考题库(突破训练)附答案详解
- 采购规范管理承诺书范文6篇
- 公司月度质量例会制度
- 2026国家统计局琼中调查队招聘公益性岗位人员1人备考题库【基础题】附答案详解
- 2026西藏中共林芝市委员会宣传部招聘公益性岗位工作人员2人备考题库含答案详解【培优a卷】
- 2026松原吉林油田医院招聘38人备考题库附完整答案详解(必刷)
- 公司零星采购管理办法
- 2025年山东省中考道德与法治试卷真题(含答案)
- 村委会党员春训活动方案
- 睾丸扭转超声诊断
- 希望小学奠基活动方案
- GB/T 16405-2025声学管道消声器无气流下插入损失测量实验室简易法
- QGDW11451-2015架空输电线路标识及安装规范
- 征兵心理测试题目及答案
- ASTM G154-23译本 中文版【后附英文官方原版 可复制可检索】
- 加装电梯可行性研究报告范文
- 安徽省皖北协作体2025届高三年级下册一模考试 化学试卷(解析版)
评论
0/150
提交评论