`

客户端HTTP消息码流分析

    博客分类:
  • Java
阅读更多

在开发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。


POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。

2、请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

3、空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
对于一个完整的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 ~!@#$%^&amp;*()_+{}|:\&quot; &lt;&gt;?`-=[]\\;',./"> <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
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

 

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

从上面码流分析可知:

  • 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消息码流:

GET /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&fileParamhttp://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)
Accept-Encoding: gzip, deflate
Host: localhost:8088
Connection: Keep-Alive
=file1.txt HTTP/1.1
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:

 

从上面码流分析可知:

  • GET方式时,表单里的参数会先以浏览器编码成%XX形式后附加到URL后,并显示在地址栏中。
  • GET方式提交表单时,如果表单URL附加参数,这些参数是不能传递到服务器端去的,相反表单里的元素会附加在URL后面并传送到服务器,所以当提交表单时,如果表单URL还附加参数,则一定要以POST方式提交,否则是不能传递到服务器。
  • GET方式提交的请求HTTP头里没有  Content-Type: application/x-www-form-urlencoded  头信息。
  • GET提交时,表单里的元素值会先用浏览器的编码方式时行编码,然后把编码转换成%xx形式的串。
  • 文件上传时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 ~!@#$%^&amp;*()_+{}|:\&quot; &lt;&gt;?`-=[]\\;',./"> <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
    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: multipart/form-data; boundary=---------------------------7d9165750396
    Accept-Encoding: gzip, deflate
    Host: localhost:8088
    Content-Length: 595
    Connection: Keep-Alive
    Cache-Control: no-cache

     

    -----------------------------7d9165750396
    Content-Disposition: form-data; name="textParam1"

     

    中a ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./
    -----------------------------7d9165750396
    Content-Disposition: form-data; name="fileParam1"; filename="file1.txt"
    Content-Type: text/plain

     

    这是第一个测试文件的内容:
    1111111111111
    aaaaaaaaaaaaa
    -----------------------------7d9165750396
    Content-Disposition: form-data; name="fileParam2"; filename="file2.txt"
    Content-Type: text/plain

     

    这是第二个测试文件的内容:
    中a
    ~!@#$%^&*()_+{}|:\" <>?`-=[]\\;',./
    -----------------------------7d9165750396--

    码流分析:

    • 文件上传时表单要设置 enctype="multipart/form-data" 属性。
    • 上传时文件与参数一起放置在HTTP体里传送,并且参数不组以%XX形式传送,而是经过浏览器编码后直接传送到服务器,但文件内容就不同了,浏览器读取要上传文件时,不会使用任何编码来读取,而是原样读取(即在上文件时浏览器是以字节流形式读取文件的,而不是以字符形式来读取的,否则会涉及到编码问题)后发往服务器(试想下,如果浏览读取上传文件时还经过了浏览器编码,那我们上传的非字符性文件会坏掉)。
    • 消息头含有Content-Length属性,它表示消息体的总体长度。

     

    附件为码流文件

     

    参考:

    http://blog.csdn.net/yc0188/archive/2009/10/29/4741871.aspx

    • 大小: 1.9 KB
    • 大小: 2.4 KB
    • 大小: 31.5 KB
    分享到:
    评论

    相关推荐

      码流分析器

      码流分析器是一种专业的工具,主要用于解析和理解传输流(Transport Stream, TS)的数据结构。在数字电视、卫星通信和互联网视频传输等领域,TS码流是常见的数据传输格式。通过码流分析,我们可以深入理解传输的...

      网络与客户端通信

      在IT领域,网络通信是计算机科学中的核心概念之一,它涉及到多台设备通过网络进行信息交换。...通过学习和分析这个实例,初学者可以深入理解网络通信的基本原理,并能够使用Java进行实际的网络编程。

      人人桌面客户端登录过程分析

      服务器发送特定的XML流来告知客户端支持的特性,例如启用TLS加密和SASL认证。SASL,即Simple Authentication and Security Layer,是一个通用的认证框架,允许在已建立的连接上添加认证支持。在XMPP中,SASL通常用于...

      java实现tcp客户端发送服务端解析程序

      本项目专注于实现一个TCP客户端,它能向服务器发送数据,以及一个服务器端,它负责接收客户端的数据并进行解析,可能还会涉及到其他业务操作,如将接收到的信息发送到Kafka消息队列或存储到数据库中,以及实现服务器...

      利用ffmpeg将RTSP传输的h264原始码流保存到文件中

      FFmpeg是一款强大的开源多媒体处理工具,能够处理多种格式的音频和视频,包括从RTSP流中提取和保存h264码流。下面将详细介绍如何利用FFmpeg完成这个任务。 首先,我们需要理解RTSP(Real-Time Streaming Protocol)...

      java编写socket服务端和客户端给予cmpp3.0

      - 通过输入输出流解析接收到的 CMPP 消息,执行相应操作,如发送回执、存储消息等。 4. **客户端实现**: - 客户端首先创建 Socket 对象,连接到服务端的 IP 地址和端口。 - 发送 CMPP 连接请求,通常包括连接...

      QQ 聊天软件 java 服务器 客户端

      3. 发送和接收消息:客户端使用Socket的输入/输出流发送和接收消息,通常采用字符编码如UTF-8进行数据编码。 4. 实时性保证:为了实现即时通讯,客户端需要不断地轮询服务器,或者使用推送技术如WebSocket,让服务器...

      http通信代码(客户端和服务器)

      在IT行业中,HTTP通信是网络应用的基础,它允许客户端(如浏览器)...通过分析和实践这些示例代码,你不仅可以掌握HTTP通信的原理,还能提升在实际项目中应用curl和mongoose的能力,为构建自己的网络应用打下坚实基础。

      基于双码流的分布式音视频系统设计.pdf

      在讨论基于双码流的分布式音视频系统设计时,我们首先需要关注音视频技术的快速发展,其中包括音视频信号处理技术、信息技术以及网络技术的进步,这些技术的发展使得音视频的展现形式更加多样化。在此基础上,人们...

      UC视频监控客户端软件

      5. **录像功能**:支持定时录像和事件触发录像,以便于后期分析和取证。 6. **电视墙模式**:模拟电视墙显示,适合大屏幕展示多路监控画面。 7. **电子地图**:用户可以创建和配置电子地图,快速定位和切换摄像头...

      mplayer中http流媒体协议分析.doc

      状态码的前三位分别表示响应的类别,如2xx表示成功,4xx表示客户端错误,5xx表示服务器错误。 **MPlayer与HTTP流媒体** MPlayer是一款开源的媒体播放器,能够支持多种流媒体协议,包括HTTP。通过HTTP协议,MPlayer...

      MQTT_FX客户端

      通过MQTT_FX客户端,开发者、测试人员和运维人员可以轻松地进行MQTT协议的调试、测试和监控,对于物联网项目中的设备交互和数据流分析具有重要作用。在实际应用中,结合MQTT协议的特性,如QoS(服务质量)等级设置,...

      oracle客户端

      Oracle客户端是数据库管理员和开发人员用来与Oracle数据库服务器交互的重要工具。PL/SQL Developer是其中一种流行的客户端,它是一款轻量级、免安装的应用程序,适用于快速便捷地访问和管理Oracle数据库。在本文中,...

      大华ICC平台联接客户端

      4. **实时监控**:连接成功后,用户可以在客户端上查看各个设备的实时视频流,同时可以调整视频质量、画面角度等。 5. **录像回放与下载**:用户可以查看已存储的录像文件,进行时间轴选择回放,也可将录像下载至...

      DVR客户端软件及使用说明

      1. **实时监控**:用户可以通过客户端软件查看连接到DVR的摄像头的实时视频流,确保能够及时掌握监控区域的情况。 2. **录像回放**:当需要查看过去某个时间段的监控画面时,客户端软件允许用户选择特定日期和时间...

      rtsp_h265_h264客户端代码.rar

      5. **同步与播放**:客户端需要正确同步不同码流,确保音视频同步播放。 6. **错误处理**:在与服务器通信过程中,客户端必须能处理可能出现的网络错误、协议错误等。 通过分析和理解这两个源代码文件,开发者可以...

      TCP接收264码流,使用ffmpeg解码

      在本项目中,TCP被用于从服务器接收连续的H.264码流,保证数据的完整性。 2. **Socket编程**:Socket是网络通信的基础,它是进程间通信(IPC)的一种方式,特别是在网络环境中。在客户端程序中,我们需要创建一个...

      Ftp客户端的简单实现

      此外,由于FTP协议的交互性质,客户端需要解析服务器的响应码来判断操作是否成功,并据此决定下一步行动。 对于初学者,理解并实现这样的FTP客户端可以帮助深入理解网络编程原理和FTP协议的工作方式。通过分析和...

    Global site tag (gtag.js) - Google Analytics