




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
HTTP与Socket分析与编程 一、 TCP/IP的介绍首先先介绍一下TCP/IP,TCP是传输层协议,IP是网络层协议。手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。建立起一个TCP连接需要经过“三次握手”: 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYNACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭 连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客 户端交互,最终确定断开)二、 HTTP连接HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用,是应用层协议。 HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常 的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道 客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。(一) HTTP 8种请求方法:1) GET:请求获取Request-URI 所标识的资源。2) POST:在Request-URI所标识的资源后附加新的数据。3) HEAD:请求获取Request-URI所标识的资源的响应消息头。4) OPTIONS:请求查询服务器性能,或查询与资源相关的选项和需求。5) PUT:请求服务器存储一个资源,并用Request-URI作为其标识。6) DELETE:请求服务器删除由Request-URI所标识的资源。7) TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断。8) CONNECT:HTTP1.1协议中预留给能够将连接改为管道方式的代理服务器。详解GET和POST1) GET:GET方法是默认的HTTP请求方法,我们日常用GET方法来提交表单数据,然而用GET提交的数据只经过简单的编码,同时它将作为URL的一部分向web服务器发送,因此使用GET方法来提交数据存在着安全隐患,例如:Http://login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB从上面的内容,可以很容易的辨认出提交表单的内容(?之后的内容),另外由GET方法提交的数据是作为URL请求的一部分,所以提交的数据量不能太大。2) POST:POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。(二) Java之HTTP通信1. 通过URLConnection的通信通信流程:第一:创建URL以及HttpURLConnection对象。第二:连接参数设置。第三:连接到服务器。第四:向服务器写数据。最后一步:从服务器读取数据。下面是一些接口的介绍:HttpURLConnection是java的标准类,继承自URLConnection类,URLConnection与HttpURLConnection都是抽象类,无法直接实例化对象。其对象主要通过URL的openConnection方法获得,创建一个httpURLConnection连接的代码如下所示:URL url = new UR(“”);HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); openConnection方法只创建URLConnection或者HttpURLConnection实例,但是并不进行真正的连接操作。并且,每次openConnection都将创建一个新的实例。因此,在连接之前我们可以对其一些属性进行设置,比如超时时间等。下面对HttpURLConnetcion实例的属性设置:/设置输入/输出流connection.setDoOutput(true); connection.setDoInput(true); /设置请求的方式为Get或者Post connection.setRequestMethod(“GET”); connection.setRequestMethod(“POST”); /在设置POST方式时要注意,POST请求方式不能够使用缓存connection.setUseCaches(false); 在完成HttpURLConnection实例的初始化以后,我们可以分别使用Get和POST方式来完成一个实例。下面两个例子是分别使用GET和POST请求方式的方法例子:1) GET请求 package com.dingo.sendurl;import .HttpURLConnection;import .URL;import java.io.IOException;import java.io.InputStream;import java.io.BufferedReader;import java.io.InputStreamReader;public class send_url_get private String urlStr;private URL url;private HttpURLConnection url_con;private String contentStr;public void setUrlStr(String urlStr) this.urlStr = urlStr;public String getContentStr() return contentStr;private void setContentStr(String contentStr) this.contentStr = contentStr;public void send_url()tryStringBuilder temp = new StringBuilder();url = new url(/urlStr);url_con= (HttpURLConnection)url.openConnection();url_con.setDoOutput(true);url_con.setRequestMethod(GET);url_con.getOutputStream().flush();url_con.getOutputStream().close();InputStream in =url_con.getInputStream();BufferedReader rd = new BufferedReader(new InputStreamReader(in);while(rd.read()!=-1)temp.append(rd.readLine();setContentStr(new String (temp); catch (Exception e)e.printStackTrace(); finallyif(url_con!=null)url_con.disconnect();2) POST 请求 /postpackage com.dingo.sendurl;import .*;import java.io.InputStream;import java.io.BufferedReader;import java.io.InputStreamReader;public class send_url_post private String urlStr;private URL url;private HttpURLConnection url_con;private String response_content;public void setUrlStr(String urlStr) this.urlStr = urlStr;public String getResponse_content() return response_content;private void setResponse_content(String response_content) this.response_content = response_content;public void send_url(String mobile_number)tryurl = new url(/urlStr);url_con=(HttpURLConnection)url.openConnection();url_con.setRequestMethod(POST);url_con.setDoOutput(true);String param=action=mobile&mobile=+mobile_number;url_con.getOutputStream().write(param.getBytes();url_con.getOutputStream().flush();url_con.getOutputStream().close();InputStream in= url_con.getInputStream();BufferedReader rd = new BufferedReader(new InputStreamReader(in);StringBuilder tempStr=new StringBuilder();while(rd.read()!=-1)tempStr.append(rd.readLine();setResponse_content(new String(tempStr); catch(Exception e)e.printStackTrace();finallyif(url_con!=null)url_con.disconnect();2. 通过HttpClient进行通信HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和HTMLUnit都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.2 (GA)。HttpClient的主要功能:1) 实现所有HTTP的方法2) 支持自动转向3) 支持HTTPS协议4) 支持代理服务器等使用HttpClient的步骤:1) 创建HttpClient实例。2) 创建某种连接方法的实例,如果是get方法就使用GetMethod,如果是post方法,就使用PostMethod,然后再方法的构造函数中传入待连接的地址。3) 调用第一步中创建好的实例的execute方法来执行第二部创建好的method实例。4) 读response5) 释放连接,无论执行方法是否成功,都要释放连接。6) 对得到后的内容进行处理。下面是一些例子用来演示HttpClient的使用。1) 读取网页(http/https)的内容packagehttp.demo;importjava.io.IOException;mons.httpclient.*;mons.httpclient.methods.*;/*最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面*authorLiudong*/publicclassSimpleClientpublicstaticvoidmain(Stringargs)throwsIOException HttpClientclient=newHttpClient();/设置代理服务器地址和端口 /client.getHostConfiguration().setProxy(proxy_host_addr,proxy_port);/使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成httpsHttpMethod method=new GetMethod();/使用POST方法/HttpMethod method = new PostMethod(); client.executeMethod(method);/打印服务器返回的状态System.out.println(method.getStatusLine();/打印返回的信息 System.out.println(method.getResponseBodyAsString();/释放连接 method.releaseConnection(); 2) 以GET或POST方式向网页提交参数我们知道如果是GET的请求方式,那么所有参数都直接放到页面的URL后面用问号与页面地址隔开,每个参数用&隔开,例如:/?name=liudong&mobile=123456,但是当使用POST方法时就会稍微有一点点麻烦。本小节的例子演示向如何查询手机号码所在的城市,代码如下:packagehttp.demo;importjava.io.IOException;mons.httpclient.*;mons.httpclient.methods.*;/*提交参数演示*该程序连接到一个用于查询手机号码所属地的页面*以便查询号码段1330227所在的省份以及城市*authorLiudong*/publicclassSimpleHttpClientpublicstaticvoidmain(Stringargs)throwsIOExceptionHttpClientclient=newHttpClient();client.getHostConfiguration().setHost(,80,http);method=getPostMethod();/使用POST方式提交数据client.executeMethod(method);/打印服务器返回的状态System.out.println(method.getStatusLine();/打印结果页面Stringresponse=newString(method.getResponseBodyAsString().getBytes(8859_1);/打印返回的信息System.out.println(response);method.releaseConnection();/*使用GET方式提交数据 *return */private static HttpMethod getGetMethod()return new GetMethod(/simcard.php?simcard=1330227);/* *使用POST方式提交数据 *return */privatestaticHttpMethodgetPostMethod()PostMethodpost=newPostMethod(/simcard.php);NameValuePairsimcard=newNameValuePair(simcard,1330227);post.setRequestBody(newNameValuePairsimcard);returnpost;在上面的例子中页面/simcard.php需要一个参数是simcard,这个参数值为手机号码段,即手机号码的前七位,服务器会返回提交的手机号码对应的省份、城市以及其他详细信息。GET的提交方法只需要在URL后加入参数信息,而POST则需要通过NameValuePair类来设置参数名称和它所对应的值。3) 处理页面重定向 在JSP/Servlet编程中response.sendRedirect方法就是使用HTTP协议中的重定向机制。它与JSP中的的区别在于后者是在服务器中实现页面的跳转,也就是说应用容器加载了所要跳转的页面的内容并返回给客户端;而前者是返回一个状态码,这些状态码的可能值见下表,然后客户端读取需要跳转到的页面的URL并重新加载新的页面。就是这样一个过程,所以我们编程的时候就要通过HttpMethod.getStatusCode()方法判断返回值是否为下表中的某个值来判断是否需要跳转。如果已经确认需要进行页面跳转了,那么可以通过读取HTTP头中的location属性来获取新的地址。状态码对应HttpServletResponse的常量详细描述301SC_MOVED_PERMANENTLY页面已经永久移到另外一个新地址302SC_MOVED_TEMPORARILY页面暂时移动到另外一个新的地址303SC_SEE_OTHER客户端请求的地址必须通过另外的URL来访问307SC_TEMPORARY_REDIRECT同SC_MOVED_TEMPORARILY下面的代码片段演示如何处理页面的重定向client.executeMethod(post);System.out.println(post.getStatusLine().toString();post.releaseConnection();/检查是否重定向intstatuscode=post.getStatusCode();if(statuscode=HttpStatus.SC_MOVED_TEMPORARILY)|(statuscode=HttpStatus.SC_MOVED_PERMANENTLY)|(statuscode=HttpStatus.SC_SEE_OTHER)|(statuscode=HttpStatus.SC_TEMPORARY_REDIRECT)/读取新的URL地址Headerheader=post.getResponseHeader(location);if(header!=null)Stringnewuri=header.getValue();if(newuri=null)|(newuri.equals()newuri=/;GetMethodredirect=new GetMethod(newuri);client.executeMethod(redirect);System.out.println(Redirect:+redirect.getStatusLine().toString();redirect.releaseConnection();elseSystem.out.println(Invalid redirect);我们可以自行编写两个JSP页面,其中一个页面用response.sendRedirect方法重定向到另外一个页面用来测试上面的例子。4) 模拟输入用户名和口令进行测试 本小节应该说是HTTP客户端编程中最常碰见的问题,很多网站的内容都只是对注册用户可见的,这种情况下就必须要求使用正确的用户名和口令登录成功后,方可浏览到想要的页面。因为HTTP协议是无状态的,也就是连接的有效期只限于当前请求,请求内容结束后连接就关闭了。在这种情况下为了保存用户的登录信息必须使用到Cookie机制。以JSP/Servlet为例,当浏览器请求一个JSP或者是Servlet的页面时,应用服务器会返回一个参数,名为jsessionid(因不同应用服务器而异),值是一个较长的唯一字符串的Cookie,这个字符串值也就是当前访问该站点的会话标识。浏览器在每访问该站点的其他页面时候都要带上jsessionid这样的Cookie信息,应用服务器根据读取这个会话标识来获取对应的会话信息。对于需要用户登录的网站,一般在用户登录成功后会将用户资料保存在服务器的会话中,这样当访问到其他的页面时候,应用服务器根据浏览器送上的Cookie中读取当前请求对应的会话标识以获得对应的会话信息,然后就可以判断用户资料是否存在于会话信息中,如果存在则允许访问页面,否则跳转到登录页面中要求用户输入帐号和口令进行登录。这就是一般使用JSP开发网站在处理用户登录的比较通用的方法。这样一来,对于HTTP的客户端来讲,如果要访问一个受保护的页面时就必须模拟浏览器所做的工作,首先就是请求登录页面,然后读取Cookie值;再次请求登录页面并加入登录页所需的每个参数;最后就是请求最终所需的页面。当然在除第一次请求外其他的请求都需要附带上Cookie信息以便服务器能判断当前请求是否已经通过验证。说了这么多,可是如果你使用httpclient的话,你甚至连一行代码都无需增加,你只需要先传递登录信息执行登录过程,然后直接访问想要的页面,跟访问一个普通的页面没有任何区别,因为类HttpClient已经帮你做了所有该做的事情了,下面的例子实现了这样一个访问的过程。packagehttp.demo;mons.httpclient.*;mons.httpclient.cookie.*;mons.httpclient.methods.*;/*用来演示登录表单的示例*authorLiudong*/publicclassFormLoginDemostaticfinalStringLOGON_SITE=localhost;staticfinalintLOGON_PORT=8080;publicstaticvoidmain(Stringargs)throwsExceptionHttpClientclient=newHttpClient();client.getHostConfiguration().setHost(LOGON_SITE,LOGON_PORT);/模拟登录页面login.jsp-main.jspPostMethodpost=newPostMethod(/main.jsp);NameValuePairname=newNameValuePair(name,ld);NameValuePairpass=newNameValuePair(password,ld);post.setRequestBody(newNameValuePairname,pass);intstatus=client.executeMethod(post);System.out.println(post.getResponseBodyAsString();post.releaseConnection();/查看cookie信息CookieSpeccookiespec=CookiePolicy.getDefaultSpec();Cookiecookies=cookiespec.match(LOGON_SITE,LOGON_PORT,/,false,client.getState().getCookies();if(cookies.length=0)System.out.println(None);elsefor(inti=0;icookies.length;i+)System.out.println(cookiesi.toString();/访问所需的页面main2.jspGetMethodget=newGetMethod(/main2.jsp);client.executeMethod(get);System.out.println(get.getResponseBodyAsString();get.releaseConnection();5) 提交XML格式的参数提交XML格式的参数很简单,仅仅是一个提交时候的ContentType问题,下面的例子演示从文件文件中读取XML信息并提交给服务器的过程,该过程可以用来测试Web服务。importjava.io.File;importjava.io.FileInputStream;mons.httpclient.HttpClient;mons.httpclient.methods.EntityEnclosingMethod;mons.httpclient.methods.PostMethod;/*用来演示提交XML格式数据的例子*/publicclassPostXMLClientpublicstaticvoidmain(Stringargs)throwsExceptionFileinput=newFile(“test.xml”);PostMethodpost=newPostMethod(“http:/localhost:8080/httpclient/xml.jsp”);/设置请求的内容直接从文件中读取post.setRequestBody(newFileInputStream(input);if(input.length()Integer.MAX_VALUE)post.setRequestContentLength(input.length();elsepost.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED);/指定请求内容的类型post.setRequestHeader(Content-type,text/xml; charset=GBK);HttpClienthttpclient=newHttpClient();intresult=httpclient.executeMethod(post);System.out.println(Response status code: +result);System.out.println(Response body: );System.out.println(post.getResponseBodyAsString();post.releaseConnection();6) 通过http上传文件httpclient使用了单独的一个HttpMethod子类来处理文件的上传,这个类就是MultipartPostMethod,该类已经封装了文件上传的细节,我们要做的仅仅是告诉它我们要上传文件的全路径即可,下面的代码片段演示如何使用这个类。MultipartPostMethodfilePost=newMultipartPostMethod(targetURL);filePost.addParameter(fileName,targetFilePath);HttpClientclient=newHttpClient();/由于要上传的文件可能比较大,因此在此设置最大的连接超时时间client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);intstatus=client.executeMethod(filePost);上面代码中,targetFilePath即为要上传的文件所在的路径。7) 访问启用认证的页面我们经常会碰到这样的页面,当访问它的时候会弹出一个浏览器的对话框要求输入用户名和密码后方可,这种用户认证的方式不同于我们在前面介绍的基于表单的用户身份验证。这是HTTP的认证策略,httpclient支持三种认证方式包括:基本、摘要以及NTLM认证。其中基本认证最简单、通用但也最不安全;摘要认证是在HTTP 1.1中加入的认证方式,而NTLM则是微软公司定义的而不是通用的规范,最新版本的NTLM是比摘要认证还要安全的一种方式。下面例子是从httpclient的CVS服务器中下载的,它简单演示如何访问一个认证保护的页面:mons.httpclient.HttpClient;mons.httpclient.UsernamePasswordCredentials;mons.httpclient.methods.GetMethod;publicclassBasicAuthenticationExamplepublicBasicAuthenticationExample()publicstaticvoidmain(Stringargs)throwsExceptionHttpClientclient=newHttpClient();client.getState().setCredentials(,realm,newUsernamePasswordCredentials(username,password);GetMethodget=newGetMethod(/products/index.html);get.setDoAuthentication(true);intstatus=client.executeMethod(get);System.out.println(status+n+get.getResponseBodyAsString();get.releaseConnection();8) 多线程模式下使用httpclient多线程同时访问httpclient,例如同时从一个站点上下载多个文件。对于同一个HttpConnection同一个时间只能有一个线程访问,为了保证多线程工作环境下不产生冲突,httpclient使用了一个多线程连接管理器的类:MultiThreadedHttpConnectionManager,要使用这个类很简单,只需要在构造HttpClient实例的时候传入即可,代码如下:MultiThreadedHttpConnectionManagerconnectionManager=newMultiThreadedHttpConnectionManager();HttpClientclient=newHttpClient(connectionManager);以后尽管访问client实例即可。三、 Socket套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCPIP协议交互提供了套接字(Socket)接口。应 用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。(一) Socket连接于TCP连接的关系创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。(二) Socket与HTTP连接由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用 中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。而HTTP连接使用的是“请求响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送 给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可 以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。(三) Java socket通信1. 1V1通信服务端:1. package com.dnion.socket; 2.3. import java.io.BufferedReader; 4. import java.io.BufferedWriter; 5. import java.io.InputStreamReader; 6. import java.io.OutputStreamWriter; 7. import java.io.PrintWriter; 8. import .ServerSocket; 9. import .Socket; 10.11. public class JabberServer 12.13. public static int PORT = 8080; 14. public static void main(String agrs) 15. ServerSocket s = null; 16. Socket socket = null; 17. BufferedReader br = null; 18. PrintWriter pw = null; 19. try 20. /设定服务端的端口号 21. s = new ServerSocket(PORT); 22. System.out.println(ServerSocket Start:+s); 23. /等待请求,此方法会一直阻塞,直到获得请求才往下走 24. socket = s.accept(); 25. System.out.println(Connection accept socket:+socket); 26. /用于接收客户端发来的请求 27. br = new BufferedReader(new InputStreamReader(socket.getInputStream(); 28. /用于发送返回信息,可以不需要装饰这么多io流使用缓冲流时发送数据要注意调用.flush()方法 29. pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),true); 30. while(true) 31. String str = br.readLine(); 32. if(str.equals(END) 33. break; 34. 35. System.out.println(Client Socket Message:+str); 36. Thread.sleep(1000); 37. pw.println(Message Received); 38. pw
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一黏土创意-制作气球大派对
- 口腔护理的重要性与技巧
- 保险公司老客户活动方案
- 保险公司送券活动方案
- 保障活动策划方案
- 信访专项活动方案
- 修脚店五一活动方案
- 俱乐部投票活动方案
- 俱乐部近期活动方案
- 值班跨年活动方案
- 《卓越服务技巧》课件
- 2025年厦门大学嘉庚学院图书馆员招考高频重点提升(共500题)附带答案详解
- 《oracle性能优化》课件
- 四川省村规划编制技术导则试行
- 2025年云南昆明市禄劝国有资本投资开发集团有限公司招聘笔试参考题库附带答案详解
- 《深圳市建设工程消防设计审查指引》(办公类)
- 案例2 进化医疗-跨物种肿瘤基因治疗的开拓者
- 小学数学二年级第二学期口算计算共3040道题
- 无人驾驶货车行业市场突围建议书
- 财务总监招聘笔试题及解答(某大型国企)2025年
- 手机成瘾课件教学课件
评论
0/150
提交评论