`

模拟浏览器与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. ...

    基于单片机的Web服务器

    综上所述,这个项目展示了如何将一个普通的单片机升级为一个具备网络通信能力的智能设备,通过C51编程实现设备的自动化搜索和Web服务器功能。C8051F020单片机结合CP2200芯片实现了USB到以太网的转换,使设备能够接入...

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

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

    ASP编写的局域网内Web QQ 通信工具

    这可能涉及到分析QQ客户端与服务器之间的数据交换,然后用ASP代码模拟这些通信过程。这包括登录、发送消息、接收消息等基本功能。 3. **数据库存储**:在局域网内,用户的信息和聊天记录可能存储在一个本地数据库中...

    web server and browser

    【描述】:通过Java编程语言,我们可以创建一个简单的Web服务器,模拟服务器与客户端(浏览器)之间的通信过程。这个过程主要涉及以下几个关键步骤: 1. **服务器端的建立**:首先,我们需要创建一个Java程序来监听...

    3160104875-杨樾人-web服务器1

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

    W3MFC web服务器源码

    6. **W3MFCCGI.cpp**:CGI(Common Gateway Interface)是Web服务器与外部程序交互的标准接口,W3MFCCGI.cpp可能涉及如何处理CGI请求,执行外部脚本或程序,并将结果返回给客户端。 7. **ThrdPool.cpp**:线程池是...

    向web服务器请求HTTP页面的mfc单文档程序

    在MFC中,我们可以利用Socket编程来实现与Web服务器的通信。Socket是网络编程的基本接口,它允许应用程序通过TCP/IP协议进行通信。在MFC中,我们通常使用CSocket或CAsyncSocket类来处理套接字操作。 1. **创建MFC单...

    C# 浏览器 功能完善 实现查看源文件 等等

    4. **安全性与隐私**:作为一个浏览器,安全性和用户隐私是必须考虑的重要因素。C#提供了许多内置的安全机制,如证书管理、SSL/TLS支持等。你需要确保所有通信都是加密的,并且遵循最小权限原则,避免敏感信息泄露。...

    手把手教你做Web网络服务器

    当我们在浏览器中输入网址并按下回车键时,实际上是向Web服务器发送了一个请求,服务器接收到请求后,会根据请求的内容返回相应的数据。 要构建一个基本的Web服务器,你需要掌握以下几个核心知识点: 1. **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处理器是一种广泛应用在嵌入式系统的微处理器,以其低功耗和高性能著称,适合于此类小型...

    计算机网络实验SOCKET编程----WEB服务器[C#版本].rar

    当一个客户端(通常是浏览器)向WEB服务器发送HTTP请求时,服务器接收到请求后解析请求头和请求体,然后根据请求类型(GET、POST等)处理请求。处理完成后,服务器会构建一个HTTP响应,并将响应数据(通常包含HTML...

    web版即时通信系统, 仿QQ聊天程序,asp.net源代码

    2. **AJAX技术**:尽管有了WebSocket,但在不支持它的旧浏览器中,开发者可能使用Ajax异步请求技术来模拟实时通信。通过XMLHttpRequest对象,页面可以在不刷新的情况下与服务器交换数据并更新部分网页内容。 3. **...

    HTTP 通信测试或者JAVAServlet测试

    在IT行业中,HTTP通信测试和Java Servlet测试是Web应用程序开发中的关键环节,它们确保了客户端与服务器之间的数据传输准确无误。在这个场景中,我们关注的是如何通过HTTP协议进行通信,以及如何使用Java Servlet来...

    javaWeb购物车模拟小程序

    【JavaWeb购物车模拟小程序】是一个实用的学习项目,旨在帮助开发者深入理解客户端浏览器与服务器之间交互的核心机制,特别是关于cookie和session的应用。这个小程序通过在Tomcat服务器上部署,可以在MyEclipse这样...

    MATLAB WEB.pdf

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

    ASP.NET 网页浏览器

    1. **WinForms或WPF**:C#可以用来开发桌面应用程序,如WinForms或WPF(Windows Presentation Foundation),这两个平台都可用于创建带有用户界面的应用,包括模拟浏览器的功能。 2. **WebBrowser控件**:在C#中,...

    Web Server程序.rar

    本压缩包"Web Server程序.rar"包含了一个Web服务器的模拟实现,这对于理解Web服务器的工作原理、学习网络编程以及深入探究计算机网络课程非常有帮助。 首先,我们要理解Web Server的基本功能。Web服务器的主要任务...

Global site tag (gtag.js) - Google Analytics