-
HTTP协议的主要特点可概括如下: 补充:这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。查看全部
-
HTTP响应码信息。查看全部
-
SYN是TCP/IP建立连接时使用的握手新号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发送一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。 ACK,即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接受无误。查看全部
-
URL:统一资源定位符,也被称为网页地址,是因特网上标准的资源的地址。URL的格式有下列三部分组成:第一部分是协议(或称为服务方式);第二部分是存有该资源的主机IP地址(有时也包括端口号);第三部分是主机资源的具体地址。如目录和文件名等。第一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”符号隔开,第一部分和第二部分是不可缺少的,第三部分有时可以省略。现在几乎所有的URI都是URL查看全部
-
客户机与服务器需要建立连接,那么这个链接的过程其实是:我们知道HTTP协议是基于TCP/IP协议之上的一个协议。所以说在客户机与服务器建立连接之前,首先是建立的一个TCP连接,我们知道TCP连接的时候首先由一个三次握手的机制才能保证连接上。那什么时候能触发这个链接机制呢?当你点击某个超链接的时候,HTTP的工作就开始了。查看全部
-
什么是http协议?<br> 超文本传输协议(HTTP-Hypertext transfer protocol)定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,Http是面向(transaction-oriented)应用层协议,它是万维网上能够可靠的交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。<br> 工作流程:<br> 一次HTTP操作成为一个事务,其工作过程可分为四步:<br> 1)首先客户机与服务器需要建立连接,只要单击某个超级链接,HTTP的工作开始<br> 2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,侯斌是MIME信息包括请求修饰符、客户机信息和可能的内容。<br> 3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号,一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。<br> 4)客户端接受服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。<br> 如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出,对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。 HTTP协议永远都是客户端发起请求,服务器端回送响应。这样就限制了使用HTTP协议,无法实现在客户端么有发起请求的时候服务器将消息推送给客户端。HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系的。查看全部
-
响应码查看全部
-
建立网络连接需要进行3次握手: 12:34查看全部
-
http协议工作过程简述查看全部
-
上传文件到服务器——APP通过HttpClient方式实现 实现步骤如图查看全部
-
上传文件到服务器——APP通过HTTPURLConnection实现 (2)真正实现,注释已经写明了 HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestMethod("POST"); conn.setReadTimeout(5000); conn.setDoInput(true); conn.setDoOutput(true); //设置请求标头 conn.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary); //因为要和server端之间读写数据,所以需要创建输出流和输入流 DataOutputStream dos = ; BufferedInputStream bis = ; byte[] buffer = new byte[1024*4]; //4k缓冲区 int len = 0; //写请求正文 dos.writeBytes(prefix+boundary+end); //写入开始边界符 dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""+fileName+"\""+end);//写入第二行 dos.writeBytes(end); //写换行 while((len = bis.read(buffer))!=-1){ dos.write(buffer, 0, len); } dos.writeBytes(end);//写换行 dos.writeBytes(prefix+boundary+prefix+end);//边界结尾 dos.flush(); //写完了 //获得响应信息,并通过MainActivity输出 ……(如图) Message msg = Message.obtain(); msg.obj = sb.toString(); handler.sendMessage(msg); ……(清理资源) 3.总结 (1)HttpURLConnection (2)Http协议和报文 (3)复习仿微信图片选择器查看全部
-
上传文件到服务器——APP通过HTTPURLConnection实现 1.MainActivity 通过一个button点击事件启动一个子线程执行上传操作,上传完毕返回一个封装响应信息的message,server端写的响应信息是“Upload Success! ” 2.新建一个子线程UploadThread,在其run()方法中实现上传 通过前面研究相关上传协议知道这里需要严格按照协议规范来,而且还需要使用HttpURLConnection的setRequestProperty()方法来指定请求标头 (1)定义如下字串为后续做准备 String boundary = "---------------------------7df1cc8160f54"; String prefix = "--"; String end = "\r\n"; (2)真正实现,注释已经写明了 (下一笔记)查看全部
-
上传文件到服务器——服务器端实现 1.Server端JSP代码实现(如图) 2.新建一个Servlet,指定包名和类名(Upload)。在Upload类中实现关键上传文件的代码逻辑 (1)通过注解来指定上传的文件存储的路径 @MultipartConfig(location="D:\\work\\JEEWorkspace") (2)在doPost()方法中实现上传的逻辑 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Part part = request.getPart("file"); //对上传文件对象的描述 part.write("testimg.jpg"); //将request请求中指定的上传文件写入到本地 response.setCharacterEncoding("UTF-8"); PrintWriter pw = response.getWriter(); //响应信息 pw.println("Upload Success!"); } 3.上传过程协议解析 通过浏览器的开发者工具可以看一下上传操作时的请求报文,这对APP实现很重要 (1)请求标头中,有一个content-type字段是文件内容的请求头,指明是一个multipart/form-data Content-Type multipart/form-data; boundary=---------------------------7df1cc8160f54 (2)请求正文 -----------------------------7df1cc8160f54 //正文开始边界符 Content-Disposition: form-data; name="file"; filename="C:\Users\zhangxt4\Pictures\imooc.jpg" Content-Type: image/pjpeg //文件描述 <二进制文件数据未显示> ---------------------------7df1cc8160f54-- //正文边界结尾查看全部
-
通过HttpURLConnection和多线程下载文件 (4)单个线程要完成的下载任务 从前面分析,这里应该创建一个线程池能执行的Runnable类,通过构造函数传入起始和结束位置,然后在其run()方法真正执行下载操作 public void run() { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); //子线程只下载从起始到结束位置的字节 conn.setRequestProperty("Range", "bytes=" + start + "-" + end); //因为要指定每次写到文件的起始位置,所以需要一个RandomAccessFile实例 RandomAccessFile access = new RandomAccessFile(fileDownload, "rw"); access.seek(start); //从上一次写入的位置尾端开始写 InputStream is = conn.getInputStream(); byte[] buffer = new byte[1024*4]; int len = 0; while((len = is.read(buffer)) != -1){ access.write(buffer, 0, len); } //关闭资源的操作,同样重要 if(access!=null) access.close(); if(is!=null) is.close(); (5)有个和MainActivity衔接的地方 if(end == byteCount - 1){ //表示三个线程已经执行完 Message msg = Message.obtain(); msg.obj = fileDownload.getAbsolutePath(); handler.sendMessage(msg); } 4.总结: (1)看视频只是了解思路,代码要自己写,bug要自己解,这样才有收获 (2)老师写构造函数的方式值得学习 (3)HTTP协议要熟悉,尤其是请求和响应字段的含义 (4)HttpURLConnection类和接口要掌握查看全部
-
通过HttpURLConnection和多线程下载文件 (3)主函数downloadFile() 实现下载的操作,这里要通过for循环来执行三个线程,每个线程下载自己对应的字节数。HttpURLConnection有两个重要接口 1)getContentLength()获取HTTP响应头中指定的响应包的内容长度 2)setRequestProperty()可以设置在HTTP请求头中指定的一些属性值,这里就可以指定需要读入的流的起始和结束字节流的位置 这样就可以通过这两个接口来实现单个线程下载分配给自己的字节:通过for循环,在执行每个线程前指定其所要下载的字节流起始和结束位置。 HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); int byteCount = conn.getContentLength(); //下载文件的总大小(字节数) int block = byteCount/3; * 为每个线程计算所要下载的字节起始和结束的位置 * 比如总有100个字节,100/3=30,再余10.那么应该分配如下 * 第一个线程要下载30个:0~29 * 第二个线程要下载30个:30~59 * 第三个线程要下载40个:60~99 long end = 0; for(int i = 0; i<3; i++){ long start = i*block; end = (i+1)*block - 1; if(i == 2){ //最后一个线程的结束位置应该是字节的结尾 end = byteCount - 1; } //下面就通过线程池来执行每个线程要完成的下载任务,执行前指定起始和结束位置 DownloaderRunnable runnable = new DownloaderRunnable(start, end); threadPool.execute(runnable); } if(end == byteCount - 1){ //已经执行完所有的线程,将下载文件的路径以message方式返回 } 注意:1)通过conn.getContentLength()可以获取文件的总字节数 2)三线程的字节数分配,这是个小算法,要熟记查看全部
举报
0/150
提交
取消