`

模拟浏览器与web服务器之间的通信

 
阅读更多

最近因为某些需要,在学习如何通过编程来和Web服务器交互。
现在似乎有点入门了,和大家分享一下心得。
(估计这也是做农场外挂等的基础,如果你有兴趣,欢迎和我讨论)

1.前期准备

必备知识/工具:
  1.http协议基础
  2.网络抓包工具

要与web服务器进行交互,基本的http协议知识是必须的。
这里我用自己的理解来简单说下吧:
初学时,需要知道http协议最重要的几个特点,否者就无法正确编写程序。

1.http协议是请求/应答模式的
就是,首先你先发一个请求给web服务器,然后web服务器会给你一个回应。
与web服务器的交互过程,就是这“一问一答”的过程。
常用请求有2种,一种是Get(用于请求获取资源)。一种是Post(用于请求提交表单等数据)

2.http协议是不维持连接的。
这个是什么意思呢?和我们上次做的foxmail的smtp协议不同,
http协议在每一次的“问答”过程结束后,服务器都会关闭连接。
就是说,你soket创建一个套接字去连接服务器,并且发送了一个请求(问),
服务器返回一个请求的结果(答)后,服务器就会关闭这个套接字。
如果要在发送第二个请求怎么办?——再创建一个套接字,再去连接服务器。

3.http协议不会记录访问者的状态
如2所说,http协议不维持连接。每一次问答结束后,连接的套接字就没用了。
那么,像论坛这样的网站是如何记住我们已经登录了呢?答案是:cookies.
在提交登录表单后,如果登录成功,服务器会返回一个或几个cookie。
在下一次的请求中,再次把这些cookie发送给服务器,来证明自己已经登录了网站。

以上3点,是我这几天学习的总结,如有错,还请高手指点。
有了http的基础知识后,我们还需要一款网络抓包工具,
去了解浏览器在与web服务器交互的过程中都发送/接收到了什么。
我们自己编写的程序,其实也就是把浏览器发给服务器的东西自己再发送一次
浏览器发送了什么,我们就发送什么,从而达到模拟浏览器与服务器交互的过程。

抓包工具有很多:Ethereal , sniffer 都可以。
这里我们只关心http的数据,所以选用:HttpWatch.
关于HttpWatch的详细使用,你们自己百度下吧。。。这里我就不罗嗦了

2.我编写的HttpTester工具

这个“工具”很简单,是用来发送一些测试的http请求数据的,并且接收服务器的回应数据。
如果想做个论坛自动灌水机,或者是什么XX网页游戏的助手的话。可以先用HttpTester来测试一下。
HttpTester界面如下:

未标题-1.jpg

下载 (40.62 KB)
2010-9-17 15:30



我的HttpTester可执行文件下载:
HttpTester.rar (135.99 KB)



HttpTester源代码:
IDE:VS2005
语言:C++

本帖隐藏的内容需要回复才可以浏览



接收数据的延迟,是发送请求后,等待多久才去接收服务器的回应。
为什么要等待呢?如果不等待,请求发送过去后(用send函数),
马上去接收数据(调用recv函数),用非阻塞的套接字会收不到任何数据(原因是明显的)。
就算用了阻塞的套接字,也可能会只收到了“半截”数据。因为服务器如果发送大量的回应数据
网络延迟的存在,我们主机可能会先收到一部分数据,而其他部分的数据在延迟了几秒后才到达。
阻塞套接字的recv接收,在收到一部分数据后,就返回了。

用非阻塞的套接字是什么情况呢?
可以先调用select函数来延迟几秒,测试是否有数据达到。有数据达到了,再调用recv去接收。
注意:select函数的行为是:一旦在指定的延迟时间内,发现能读取数据后,它就返回。
就是说,当只有半截数据过来时,select也返回了,这时调用recv还是只接收到了半截数据。

用简单的方法,阻塞和非阻塞套接字都不能很好地完全接收数据。
我的做法是:先用Sleep函数延迟几秒,然后select函数判断一下,是否有能读取的数据。
如果有,就调用recv去接收。由于事先调用了select判断,
我觉得这里用阻塞的,非阻塞的套接字都无关紧要。

我的这个做法,还有缺陷,就是延迟时间不够的话,还是不能完全接收服务器的回应数据。
回想http协议的特点,服务器会在回应完毕后,关闭套接字。
我们可以尝试做一个recv接收数据循环。循环终止的条件是:套接字已被服务器closesocket掉了。
这个尝试,就交给你们来完成了,谁有做这个测试的,得出结果后,请通知我。。。
我的简单处理方法,已能应付大多数情况。嘿嘿。



3.HttpWatch+HttpTester与服务器交互。

3.1取得CSDN注册会员页面的验证码图片

我先举这个例子来说明,其他的应该可以触类旁通了。

CSDN注册会员的页面地址是:http://passport.csdn.net/UserLogin.aspx?from=%2fPassport.aspx

我们要取得这个页面上的这张验证码图片:

02.jpg



1.打开HttpWatch来分析浏览器在取这张验证码时发送了怎样的请求。

03.jpg

下载 (107.74 KB)
2010-9-17 16:11



我们可以看到浏览器在请求这张图片时,发送了如下数据:

GET /ShowExPwd.aspx?temp=ge6nmewq HTTP/1.1
Accept: */*
Referer: http://passport.csdn.net/UserLogin.aspx?from=%2fPassport.aspx
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host: passport.csdn.net
Connection: Keep-Alive
Cookie: ASP.NET_SessionId=na0bcr0ukuehaamjvzbskgta; ClientKey=ab5eb6b5-94b**5a5-99fb-1662df04030a

2.打开HttpTest,把这串数据原封不动地复制到“请求的数据”编辑框中。
如下图:
注意:填写“请求的数据”,末尾必须要有2个空行。否则收不到任何回应。

04.jpg

下载 (60.83 KB)
2010-9-17 16:16



“服务器地址”编辑框填写web服务器的IP或者域名,这里是:passport.csdn.net
“服务器端口”编辑框填写web主机的端口,http协议默认端口是80,这里我们填写默认的端口号:80
“接收数据的延迟”编辑框,设置为:1000(一秒)

然后,就可以点“发送”按钮了。
服务器回应结果如下图:

05.jpg

下载 (78.83 KB)
2010-9-17 16:25



输入一个文件名,然后点“保存数据”按钮,就会把服务器返回的图片数据保存为文件。
然后点“打开文件”,就可以浏览到收到的验证码图片了。

3.2获取咱如鹏网首页的logo图片。

通过HttpWatch的分析,我们知道浏览器在获取咱如鹏网logo时
是发送了类似如下的请求:

GET /forum/templates/uchome/images/logo.gif HTTP/1.1
Accept: */*
Referer: http://www.rupeng.com/forum/
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host: www.rupeng.com
Connection: Keep-Alive
Cookie: cdb_sid=Nm5oej

对http协议有初步了解后,我们知道,如果只是想“单纯地”获取如鹏网logo
只需要发送如下的请求就够了:
(注意:发送的请求最后需要有2个空行)

GET /forum/templates/uchome/images/logo.gif HTTP/1.1
Host: www.rupeng.com


下图显示获取如鹏网ogo的情况。

06.jpg

下载 (68.96 KB)
2010-9-17 16:36




3.3 获取如鹏网首页数据

还是老样子,先用HttpWatch来分析。
发现浏览器在获取如鹏首页发送了如下请求:

GET /forum/ HTTP/1.1
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host: www.rupeng.com
Connection: Keep-Alive

我做的HttpTester有点烂,没有gzip压缩/解压缩功能。(嘿嘿,其实是我自己现在写不出算法)
所以,要用我的HttpTester获取如鹏首页数据,需要改一改上面的请求。
修改后的请求如下:

GET /forum/ HTTP/1.1
Accept-Encoding: utf-8
Host: www.rupeng.com

这里主要改了Accept-Encoding头从原先的gzip改成utf-8,说明我们只能接收utf-8编码的内容。

下图显示获取如鹏网首页数据的情况:

07.jpg

下载 (83.1 KB)
2010-9-17 16:51




4.模拟浏览器登录网站

我的这个帖子《查看咱网站用户信息》是一个例子
http://www.rupeng.com/forum/thread-15682-1-1.html

用HttpTester可以一步步讲解步骤的。但是这里篇幅原因就不说了
主要是提取cookie和填写cookie。提交请求,获取页面信息这样。


5.Chunked解码

在“3.3 获取如鹏网首页数据”这一步中,获取首页后,
查看服务器返回的消息报头,有这么一段:Transfer-Encoding: chunked
这个报头字段说明返回的附加数据(这里是页面数据)是经过chunked编码的。

如果要保存返回的附加数据的话,需要chunked解码。
( 勾选“chunked解码”复选框再保存数据。
Chunked解码比较简单,我自己写了一个简单的解码函数在HttpTester里面,
这个解码过程可能会有些问题,但目前还够用,呵呵 )

其实,如鹏网首页数据不用Chunked解码来查看也是可以的。
我遇过一个网站,获取一张验证码图片后,原本1.5K的图片数据,
它给Chunked编码到了4K发过来。-。-
这里不Chunked解码就无法查看图片的内容了。。。


分享到:
评论

相关推荐

    (牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码)

    (牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码) 技术框架: 1. 线程池 + 非阻塞 socket + epoll + 事件处理的并发模型 2. 状态机解析HTTP请求 3. 心跳机制 4. 简易日志系统 主要内容: 1. ...

    基于Linux嵌入式Web服务器的设计与实现.pdf

    1. **HTTP协议**:HTTP协议是Web服务器的核心,用于在客户端(如浏览器)和服务器之间交换信息。嵌入式Web服务器通常实现HTTP1.1协议,支持基本的请求方法(如GET、POST)和响应状态码。 2. **CGI(通用网关接口)*...

    3160104875-杨樾人-web服务器1

    在Java中实现Web服务器,首先需要理解HTTP协议,它是Web服务器和浏览器之间通信的基础。服务器需要解析HTTP请求,如GET、POST等,并根据请求内容生成相应的HTTP响应。同时,为了处理多个并发的客户端连接,服务器...

    基于嵌入式Web服务器的网络视频监控系统.pdf

    传统的视频监控系统主要由模拟摄像机、矩阵切换器、录像机等组成,局限于本地查看,而基于嵌入式Web服务器的网络视频监控系统则突破了这一限制,实现了远程监控和操作。 该系统的核心是嵌入式Web视频服务器,它采用...

    webSocket 模拟 - Node.js 服务器

    SockJS 为您提供了一个连贯的、跨浏览器的 Javascript API,它可以在浏览器和 Web 服务器之间创建一个低延迟、全双工、跨域的通信通道,无论是否有 WebSocket。这需要使用 Node.js 服务器(这是 Node.js 的一个版本...

    基于ARM的家庭Web服务器系统.pdf

    【基于ARM的家庭Web服务器系统】是指使用ARM处理器构建的家庭级Web服务器系统,主要应用于实现智能家居的远程监控和控制。ARM处理器是一种广泛应用在嵌入式系统的微处理器,以其低功耗和高性能著称,适合于此类小型...

    MATLAB WEB.pdf

    MATLAB Web 服务器作为TCP/IP应用程序,负责管理和调度MATLAB应用与Web之间的通信。Matweb作为一个CGI扩展,既是MATLAB Web 服务器的客户端,也是HTTP请求的处理器,它将用户的请求转发给MATLABserver1exe来执行M...

    运用WAS进行Web负载测试.doc

    2. **模拟浏览器和Modem速度**:它可以模拟不同类型的浏览器和Modem速度,以测试在各种用户环境下的性能。 3. **脚本录制与回放**:WAS允许通过记录用户在浏览器上的活动来生成测试脚本,也可以导入IIS日志、指向...

    python3实现微型的web服务器

    在这个例子中,我们使用Python的socket库来处理网络通信,模拟Web服务器的行为。 代码开始时,导入了必要的模块`socket`和`os`。`os.path`用于处理路径操作,`socket`则用于创建和管理网络连接。接着,定义了一个...

    WEB网络技术(介绍)

    1. **HTTP和HTTPS协议**:超文本传输协议(HTTP)是Web通信的基础,用于在客户端(浏览器)和服务器之间交换数据。HTTPS是HTTP的安全版本,通过SSL/TLS加密确保数据传输的安全性。 2. **HTML、CSS和JavaScript**:...

    WEB测试工作流程.docx

    Web服务器负责处理客户端(浏览器)的请求,并返回相应的网页内容。HTTP协议是Web通信的基础,它定义了客户端和服务器之间交换数据的格式和规则。 2. **URL(统一资源定位符)** URL是访问Web资源的唯一地址,包括...

    嵌入式linux远程控制需求分析分享.pdf

    总体拟采用以ARM核的32位嵌入式微处理器为硬件平台,结合通信技术,通过移植嵌入式操作系统,并在其上开发相应的驱动程序、应用程序和嵌入式WEB服务器实现一个方便、实用的家庭网关。 系统的软件结构系统采用在...

    Comet服务器推送技术

    4. **Flash XML Socket**:利用Flash的XMLSocket类创建套接字连接,JavaScript可以通过Flash接口与服务器通信。这种方式受防火墙和代理服务器限制,且需要客户端安装Flash支持。 5. **Java Applet套接口**:通过...

    计算机网络模拟题.doc

    10. **WWW通信协议**:WWW应用中的浏览器和Web服务器之间使用HTTP(超文本传输协议)进行通信。 **单项选择题解析**: 1. 双绞线互相绞合是为了降低信号干扰的程度。 2. 模拟消息在数字信道上的传输需通过调制解调...

    工业实时监控系统WEB客户端实现.doc

    WebSocket技术用于浏览器与服务器之间的数据交换,而SVG则用于在浏览器中呈现监控画面。 在WebSocket出现之前,开发者通常采用轮询、长轮询或流技术来模拟实时性。轮询是客户端定时向服务器发送请求,虽然简单但...

    基于linux的webserver编程实例.doc

    学生可能会分享在学习过程中遇到的挑战,理解Web服务器工作原理、CGI概念以及如何将它们与嵌入式系统集成的经验。他们可能还会提出对课程内容、教学方法或实践环节的改进建议,以帮助其他同学更好地掌握相关知识。 ...

    HTTP Methods

    HTTP(HyperText Transfer Protocol)是超文本传输协议,设计目的是保证客户机与服务器之间的通信,工作方式是客户机与服务器之间的请求-应答协议。下面是对各种HTTP方法的详细总结及使用经验。 GET 方法 * 从指定...

    《Web高级程序设计》课程教学大纲.docx

    这一部分的难点在于理解浏览器/服务器模型和Web服务器的配置。 接下来,课程深入讲解HTML语言和级联样式表(CSS),使学生能够创建和编辑基本的网页布局,包括超链接、表格、表单和框架。CSS的应用是提升网页美观度...

    基于B_S模式的MATLAB应用研究.pdf

    MATLAB Server是一个多线程TCP/IP服务器,专门用于管理Web应用程序与MATLAB之间的通信。MATLAB Web应用程序通常通过CGI(通用网关接口)与HTTPD协同工作,以提取HTML文件中的数据并传递给MATLAB Server。 【远程...

    Web自动化测试.pptx

    尽管录制可能是在特定浏览器(如IE)中进行,但实际执行测试时并不局限于该浏览器,而是通过标准的HTTP通信与服务器交互。创建Web测试时,需要注意清除可能导致测试干扰的缓存和历史记录。 操作Web测试主要包括录制...

Global site tag (gtag.js) - Google Analytics