- 浏览: 1340783 次
- 性别:
- 来自: 湖南澧縣
文章分类
最新评论
-
虾米小尹:
不行啊!2.2-0.25=1.9500000000000002 ...
JavaScript浮点数运算 —— 精度问题 -
heluping000000:
引用String a= "abc",首先在 ...
String,到底创建了多少个对象? -
mack:
谢谢分享matcher.appendReplacement(s ...
string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement -
wzt3309:
完全理解,比网上其他资料都要详细
String,到底创建了多少个对象? -
u014771876:
Java中十六进制转换 Integer.toHexString()
在开发Web程序时,我们向Web服务发送请求是最常见的事,如果了解向服务器提交的HTTP码流,对有些问题我们就会有很好的把握,比如HTTP信息结构、乱码产生、表单参数以及URL绑定参数的传递提交机制,对我们提交的数据心中有数。下面我们就来看看通过表单与URL两种提交请求方式时各自的HTTP码流究竟如何?先来了解了解HTTP消息格式。
HTTP消息格式
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
1、请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
2、请求头部 3、空行
POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。
4、请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
了解了HTTP消息格式后,先我们要模拟服务器,让客户端往我们模拟服务器发送,这样我们就可以截获码流。下面是服务器模拟程序:
客户端HTTP码流端截取程序
import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.ServerSocket; import java.net.Socket; public class HttpServer { public static void main(String[] args) { try { ServerSocket sSocket = new ServerSocket(8088); Socket socket = sSocket.accept(); InputStream is = socket.getInputStream(); //String encode = "GB2312"; String encode = "UTF-8"; putStream(is, encode); } catch (IOException e) { e.printStackTrace(); } } public static void putStream(InputStream is, String encode) throws IOException, UnsupportedEncodingException { byte[] content = new byte[1024]; int readCount = is.read(content); OutputStreamWriter bos = new OutputStreamWriter(System.out); while (readCount != 0) { bos.write(new String(content, 0, readCount, encode)); bos.flush(); readCount = is.read(content); } is.close(); } }
POST方式提交表单并且URL后面绑定参数
JSP页面如下:
<%@ page language="java" contentType="text/html; charset=GB2312" pageEncoding="GB2312"%> <html> <body> <form name=form1 action="" method="post"> <input type="text" name="textParam1" size="50 px" value="中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./"> <br> <input type="file" name="fileParam" size="50 px" value=""> <br> <input type="button" value="submit" onclick="submitForm()"> </form> <script type="text/javascript"> function submitForm(){ var str ="中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./"; //form1.action = "gb2312rs.jsp?qryParam1=" + encodeURIComponent(str) + "&qryParam2="+ encodeURIComponent(form1.textParam1.value) ; form1.action = "http://localhost:8088/gb2312rs.jsp?qryParam1=" + encodeURIComponent(str) + "&qryParam2="+ encodeURIComponent(form1.textParam1.value) ; form1.submit(); } </script> </body> </html>
页面截图:
提交后地址栏如下:
http://localhost:8080/HttpStream/gb2312rs.jsp?qryParam1=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%22%20%3C%3E%3F%60-%3D%5B%5D%5C%3B'%2C.%2F&qryParam2=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%5C%22%20%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B'%2C.%2F
HTTP消息码流:
POST /gb2312rs.jsp?qryParam1=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%22%20%3C%3E%3F%60-%3D%5B%5D%5C%3B'%2C.%2F&qryParam2=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%5C%22%20%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B'%2C.%2F HTTP/1.1 textParam1=%D6%D0a+%7E%21@%23%24%25%5E%26*%28%29_%2B%7B%7D%7C%3A%5C%22+%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B%27%2C.%2F&fileParam=file1.txt
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://localhost:8080/HttpStream/gb2312.jsp
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8088
Content-Length: 132
Connection: Keep-Alive
Cache-Control: no-cache
从上面码流分析可知:
- URL后绑定的参数会显示在HTTP消息头中。
- 文件类型没有传到服务器,因为表单未设置enctype="multipart/form-data",但文件名却传过来了。
- 提交请求为编码方式为GB2312的页面表单时,参数qryParam1与参数qryParam2都是UTF-8的编码格式,而不是以GBP312方式编码的,因此encodeURIComponent()函数是固定以UTF-8编码的,它不会受到当前浏览器的编码影响。
- 经过encodeURIComponent()函数编码后的附加参数内容会以%xx形式串显示在地址栏中。
- POST方式的HTTP头与HTTP体是用一个回车换行来分隔的。
- POST方式提交表单,如果URL后面还附还参数,也会提交到服务器,且放在HTTP头部,其他表单输入元素会放在HTTP体里传送。
- POST方式提交表单时,在头部会有 Content-Type: application/x-www-form-urlencoded 这样一个头信息,而GET方式提交的表单是不会有该头信息的,也不会有HTTP请求体。
- POST方式提交时,表单里的元素值会先用浏览器的编码(这里使用的是GB2312编码)方式时行编码(a-z A-Z 0-9 +@*_-. 不进行编码),然后把编码转换成%xx(xx为两位的十六进制)形式参数串后传送到服务器。
GET方式提交表单
JSP页面如下:
与上面一样,只是表单提交方式改为 get。
页面截图:
与上面一样。
提交后地址栏如下:
http://localhost:8088/gb2312rs.jsp?textParam1=%D6%D0a+%7E%21@%23%24%25%5E%26*%28%29_%2B%7B%7D%7C%3A%5C%22+%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B%27%2C.%2F&fileParam=file1.txt
HTTP消息码流:
从上面码流分析可知:
文件上传时HTTP码流
JSP页面如下:
<%@ page language="java" contentType="text/html; charset=GB2312" pageEncoding="GB2312"%> <html> <body> <form name=form1 action="" method="post" enctype="multipart/form-data"> <input type="text" name="textParam1" size="50 px" value="中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./"> <br> <input type="file" name="fileParam1" size="50 px" value=""> <br> <input type="file" name="fileParam2" size="50 px" value=""> <br> <input type="button" value="submit" onclick="submitForm()"> </form> <script type="text/javascript"> function submitForm(){ var str ="中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./"; form1.action = "http://localhost:8088/gb2312rs.jsp?qryParam1=" + encodeURIComponent(str) + "&qryParam2="+ encodeURIComponent(form1.textParam1.value) ; form1.submit(); } </script> </body> </html>
页面运行图:
HTTP消息码流:
POST /gb2312rs.jsp?qryParam1=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%22%20%3C%3E%3F%60-%3D%5B%5D%5C%3B'%2C.%2F&qryParam2=%E4%B8%ADa%20~!%40%23%24%25%5E%26*()_%2B%7B%7D%7C%3A%5C%22%20%3C%3E%3F%60-%3D%5B%5D%5C%5C%3B'%2C.%2F HTTP/1.1
-----------------------------7d9165750396
中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./
这是第一个测试文件的内容:
这是第二个测试文件的内容: |
码流分析:
- 文件上传时表单要设置 enctype="multipart/form-data" 属性。
- 上传时文件与参数一起放置在HTTP体里传送,并且参数不组以%XX形式传送,而是经过浏览器编码后直接传送到服务器,但文件内容就不同了,浏览器读取要上传文件时,不会使用任何编码来读取,而是原样读取(即在上文件时浏览器是以字节流形式读取文件的,而不是以字符形式来读取的,否则会涉及到编码问题)后发往服务器(试想下,如果浏览读取上传文件时还经过了浏览器编码,那我们上传的非字符性文件会坏掉)。
- 消息头含有Content-Length属性,它表示消息体的总体长度。
附件为码流文件
参考:
http://blog.csdn.net/yc0188/archive/2009/10/29/4741871.aspx
发表评论
-
Java正则表达式
2014-03-14 10:16 1775Java正则表达式详解 作者:jzj 文 ... -
类的初始化与清理
2013-06-24 22:20 1465初始化时内存清零 当创建一个对象时,首先将在堆上为这个对象分 ... -
protected,这个错了吗?
2013-06-24 22:17 1259这几天对protected修饰符有点迷糊,随便找同事要了一本 ... -
Java中BigDecimal的8种舍入模式
2013-06-21 18:42 2195java.math.BigDecimal不可变的、任意精度的 ... -
Tomcat性能参数设置
2010-12-27 15:35 34816默认参数不适合生产环境使用,因此需要修改一些参数 1、 ... -
Java 6 JVM参数选项大全
2010-12-14 11:16 1643http://kenwublog.com/docs/java6 ... -
对象的安全构造
2013-06-21 18:43 1555在构造期间,不要公布“this”引用 一种可以将数据争用引 ... -
Java断言(assert)—— 转
2010-06-20 10:36 12131一、概述 在C和C++语言中都有assert关键,表示断言。 ... -
eclipse调试
2010-06-04 00:11 8092eclipse远程调试 在eclipse3.4前,远程调试时 ... -
protected,你真的理解了吗?
2010-05-09 17:56 2156Java中的访问控制修饰符有四个级别,但属protected最 ... -
利用反射进行深层克隆
2010-05-05 21:02 3682最近在看《effective java ... -
类与类之间的几种关系
2010-05-03 13:49 2428类和类、类和接口、接 ... -
运行java
2010-05-03 13:47 1059用javac命令编译一个打包的类时,如果没有加参数" ... -
Java内存模型与volatile
2010-04-25 13:21 18934内存模型描述的是程序 ... -
中断线程
2010-04-24 21:19 9018中断线程 线程的thread.i ... -
java中的关键字、保留字、标示符
2010-04-07 23:48 3384关键字 Java的关键字对java的编译器有特殊的意义, ... -
Java中的浮点数剖析
2010-04-07 23:27 4744定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固 ... -
线程间的同步与互斥
2010-03-23 21:29 2312线程间的同步(实指线程间的通信):一般来说,一个线程相对于另 ... -
UTF-16、UTF-16BE、UTF-16LE编码方式的区别
2010-03-23 21:20 9854import java.io.IOException; ... -
final、finally、finalize
2010-01-22 01:15 2442final关键字 先看看final关键字,它可以被用于以下几个 ...
相关推荐
码流分析器是一种专业的工具,主要用于解析和理解传输流(Transport Stream, TS)的数据结构。在数字电视、卫星通信和互联网视频传输等领域,TS码流是常见的数据传输格式。通过码流分析,我们可以深入理解传输的...
在IT领域,网络通信是计算机科学中的核心概念之一,它涉及到多台设备通过网络进行信息交换。...通过学习和分析这个实例,初学者可以深入理解网络通信的基本原理,并能够使用Java进行实际的网络编程。
服务器发送特定的XML流来告知客户端支持的特性,例如启用TLS加密和SASL认证。SASL,即Simple Authentication and Security Layer,是一个通用的认证框架,允许在已建立的连接上添加认证支持。在XMPP中,SASL通常用于...
本项目专注于实现一个TCP客户端,它能向服务器发送数据,以及一个服务器端,它负责接收客户端的数据并进行解析,可能还会涉及到其他业务操作,如将接收到的信息发送到Kafka消息队列或存储到数据库中,以及实现服务器...
FFmpeg是一款强大的开源多媒体处理工具,能够处理多种格式的音频和视频,包括从RTSP流中提取和保存h264码流。下面将详细介绍如何利用FFmpeg完成这个任务。 首先,我们需要理解RTSP(Real-Time Streaming Protocol)...
- 通过输入输出流解析接收到的 CMPP 消息,执行相应操作,如发送回执、存储消息等。 4. **客户端实现**: - 客户端首先创建 Socket 对象,连接到服务端的 IP 地址和端口。 - 发送 CMPP 连接请求,通常包括连接...
3. 发送和接收消息:客户端使用Socket的输入/输出流发送和接收消息,通常采用字符编码如UTF-8进行数据编码。 4. 实时性保证:为了实现即时通讯,客户端需要不断地轮询服务器,或者使用推送技术如WebSocket,让服务器...
在IT行业中,HTTP通信是网络应用的基础,它允许客户端(如浏览器)...通过分析和实践这些示例代码,你不仅可以掌握HTTP通信的原理,还能提升在实际项目中应用curl和mongoose的能力,为构建自己的网络应用打下坚实基础。
在讨论基于双码流的分布式音视频系统设计时,我们首先需要关注音视频技术的快速发展,其中包括音视频信号处理技术、信息技术以及网络技术的进步,这些技术的发展使得音视频的展现形式更加多样化。在此基础上,人们...
5. **录像功能**:支持定时录像和事件触发录像,以便于后期分析和取证。 6. **电视墙模式**:模拟电视墙显示,适合大屏幕展示多路监控画面。 7. **电子地图**:用户可以创建和配置电子地图,快速定位和切换摄像头...
状态码的前三位分别表示响应的类别,如2xx表示成功,4xx表示客户端错误,5xx表示服务器错误。 **MPlayer与HTTP流媒体** MPlayer是一款开源的媒体播放器,能够支持多种流媒体协议,包括HTTP。通过HTTP协议,MPlayer...
通过MQTT_FX客户端,开发者、测试人员和运维人员可以轻松地进行MQTT协议的调试、测试和监控,对于物联网项目中的设备交互和数据流分析具有重要作用。在实际应用中,结合MQTT协议的特性,如QoS(服务质量)等级设置,...
Oracle客户端是数据库管理员和开发人员用来与Oracle数据库服务器交互的重要工具。PL/SQL Developer是其中一种流行的客户端,它是一款轻量级、免安装的应用程序,适用于快速便捷地访问和管理Oracle数据库。在本文中,...
4. **实时监控**:连接成功后,用户可以在客户端上查看各个设备的实时视频流,同时可以调整视频质量、画面角度等。 5. **录像回放与下载**:用户可以查看已存储的录像文件,进行时间轴选择回放,也可将录像下载至...
1. **实时监控**:用户可以通过客户端软件查看连接到DVR的摄像头的实时视频流,确保能够及时掌握监控区域的情况。 2. **录像回放**:当需要查看过去某个时间段的监控画面时,客户端软件允许用户选择特定日期和时间...
5. **同步与播放**:客户端需要正确同步不同码流,确保音视频同步播放。 6. **错误处理**:在与服务器通信过程中,客户端必须能处理可能出现的网络错误、协议错误等。 通过分析和理解这两个源代码文件,开发者可以...
在本项目中,TCP被用于从服务器接收连续的H.264码流,保证数据的完整性。 2. **Socket编程**:Socket是网络通信的基础,它是进程间通信(IPC)的一种方式,特别是在网络环境中。在客户端程序中,我们需要创建一个...
此外,由于FTP协议的交互性质,客户端需要解析服务器的响应码来判断操作是否成功,并据此决定下一步行动。 对于初学者,理解并实现这样的FTP客户端可以帮助深入理解网络编程原理和FTP协议的工作方式。通过分析和...