最近因为某些需要,在学习如何通过编程来和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界面如下:

下载 (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
我们要取得这个页面上的这张验证码图片:

下载 (41.23 KB)
2010-9-17 16:07
1.打开HttpWatch来分析浏览器在取这张验证码时发送了怎样的请求。

下载 (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个空行。否则收不到任何回应。

下载 (60.83 KB)
2010-9-17 16:16
“服务器地址”编辑框填写web服务器的IP或者域名,这里是:passport.csdn.net
“服务器端口”编辑框填写web主机的端口,http协议默认端口是80,这里我们填写默认的端口号:80
“接收数据的延迟”编辑框,设置为:1000(一秒)
然后,就可以点“发送”按钮了。
服务器回应结果如下图:

下载 (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的情况。

下载 (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编码的内容。
下图显示获取如鹏网首页数据的情况:

下载 (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解码就无法查看图片的内容了。。。
分享到:
相关推荐
SignalR是ASP.NET框架下的一款库,用于在服务器和Web客户端之间实现实时双向通信。这个库简化了创建实时Web应用程序的过程,使得开发者能够轻松地推送数据从服务器到客户端,而不仅仅是请求响应的传统模式。在描述中...
在处理返回数据时,Web服务器通常需要与应用程序或后端服务协作。例如,对于一个动态请求,服务器可能需要调用PHP脚本或Java应用服务器来生成响应。这涉及到CGI(通用网关接口)或FastCGI协议,或者更现代的如WSGI...
综上所述,这个项目展示了如何将一个普通的单片机升级为一个具备网络通信能力的智能设备,通过C51编程实现设备的自动化搜索和Web服务器功能。C8051F020单片机结合CP2200芯片实现了USB到以太网的转换,使设备能够接入...
当一个客户端(如浏览器)发起请求时,Web服务器解析请求内容,根据请求方法(GET、POST等)和URL找到相应的静态或动态资源,然后将响应数据回传给客户端。 在实验中,你可能会接触到以下几个关键知识点: 1. **...
HTTP协议是Web浏览器和Web服务器之间交互的主要方式,它有两种主要的请求类型:GET和POST。当Web服务器接收到请求后,会执行一系列操作,生成HTML响应并回传给客户端。 Web服务器程序有多种类型,包括CGI(通用网关...
Web服务器主要负责接收来自客户端(通常是Web浏览器)的HTTP请求,并根据请求内容返回相应的HTTP响应。HTTP是超文本传输协议,是互联网上应用最为广泛的一种网络协议。GET和POST是HTTP中最常见的两种请求方法,GET...
2. **HTTP模块**: Node.js的http模块是构建浏览器后端的关键,它可以用来创建服务器,处理HTTP请求和响应,模拟浏览器与服务器之间的通信。 3. **HTML解析**: 需要一个库如cheerio或jsdom来解析和操作HTML文档,...
(牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码) 技术框架: 1. 线程池 + 非阻塞 socket + epoll + 事件处理的并发模型 2. 状态机解析HTTP请求 3. 心跳机制 4. 简易日志系统 主要内容: 1. ...
这个库广泛应用于Web服务调用、API接口测试以及自动化脚本中,因为它可以模拟浏览器的行为,进行GET、POST等复杂的HTTP请求。 在Java编程中,HttpClient提供了一个强大的API,允许我们创建自定义的HTTP请求,设置...
Web服务器是互联网上的重要组成部分,它们负责接收HTTP(超文本传输协议)请求并返回HTTP响应,从而实现客户端(如浏览器)与服务器之间的数据交换。在这个主题中,我们将深入探讨Web服务器的工作原理,特别是Java...
1. **HTTP协议**:HTTP协议是Web服务器的核心,用于在客户端(如浏览器)和服务器之间交换信息。嵌入式Web服务器通常实现HTTP1.1协议,支持基本的请求方法(如GET、POST)和响应状态码。 2. **CGI(通用网关接口)*...
当用户在浏览器中输入路由器的IP地址时,Web服务器会读取这些文件并呈现相应的网页。 6. **扒站过程**:描述中提到的“扒站老费劲了”暗示了获取这些源码可能需要技术知识,例如通过网络抓包、模拟登录或分析固件来...
Java Web即时通信主要依赖于WebSocket协议,这是一种在Web上实现双向通信的技术,允许服务器和客户端进行实时、低延迟的数据交换。在"实现简单的网上即时通信,相当于是淘宝,京东客服功能的简单版"这个场景中,...
在IT行业中,HTTP客户端是用于与HTTP服务器进行通信的软件组件。HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器。当我们谈论“浏览器发送模拟httpclient软件...
Web跨浏览器进程通信,也称为Web跨域通信,是指在不同的浏览器实例或窗口之间进行数据交换和消息传递的技术。在Web应用中,由于同源策略的限制,不同域名、协议或端口的页面通常不能直接通信。然而,通过特定的技术...
这可能涉及到分析QQ客户端与服务器之间的数据交换,然后用ASP代码模拟这些通信过程。这包括登录、发送消息、接收消息等基本功能。 3. **数据库存储**:在局域网内,用户的信息和聊天记录可能存储在一个本地数据库中...
嵌入式Web服务器采用B/S架构,由Web服务器和Web浏览器组成。Web服务器的主要任务是等待客户端连接,响应客户端请求,并给出相应的回答。Web系统主要采用HTTP协议,并使用URL、HTML和CGI等方式进行信息的定位、存取和...
5. **Web服务器**:项目可能使用了Web服务器(如Apache或Node.js)来托管Armok Web Services的后端服务,处理用户请求并转发到运行Dwarf Fortress的远程服务器。 6. **远程桌面协议**:Xpra使用了一种类似RDP(远程...
在IT行业中,模拟客户端访问Webserver工具是一种至关重要的软件,主要用于测试和调试Web服务器的性能、功能以及稳定性。这类工具允许开发者和系统管理员在没有实际用户交互的情况下模拟大量的并发请求,以便于发现...