HTTP消息结构

客户端请求包括四部份:请求行(状态行)、请求头、空行、请求主体(数据),如下图:

服务端响应包括四部份:响应行(状态行)、响应头、空行、响应主体(数据),如图:

HTTP请求方法:

POST 、GET  、HEADE、  PUT、  TRACE  、DELETE 、OPTIONS 、CONNECT  (前三种最实用),有这麽多的请求方法,但web服务器不一定所有的都支持。

GET   基本一致,请求指定的页面信息,并返回实体主体。

HEAD  基本和GET一致 ,只不过返回的响应中没有具体的内容,用于获取报头

POST  向指定资源提交数据进行处理请求(例如表单、上传文件)。数据被包含在请求体中。该请求可能会导致新资源的建立或   已有资源的修改

OPTIONS 返回服务器可用的方法 ,允许客户端查看服务器的性能。

PUT  从客户端向服务器传送的数据取代指定的文档的内容。

DELETE 请求服务器删除指定的页面

CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

TRACE  回显服务器收到的请求,主要用于测试或诊断。

HTTP状态码

HTTP状态码分五类

1xxx    接收到请求,继续处理

2xxx    请求成功

3xxx   重定向

4xxx   客户端错误

5xxx  服务器请求错误

常用的常态码

200          请求成功

301/302             永久/临时重定向

304         未修改,从缓存中进行读取

404         资源不存在

500         服务器内部错误

307         重定向中保持原有得数据不丢失

503         服务器暂时不可用

根据上面的对HTTP有了一定的了解,根据对应的请求的方式进行拼接

PHP+SOCKET 模拟HTTP请求

接口

**
* Interface php_socket
*/
interface php_socket
{
/**
* @return mixed
*/
public function get(); /**
* @return mixed
*/
public function post($param); /**
* @return mixed
*/
public function request(); /**
* @return mixed
*/
public function header_info(); /**
* @return mixed
*/
public function body_info($param); /**
* @return mixed
*/
public function connect();
}

实现接口

class  implement_socket implements php_socket
{
protected $http_tpye = 'HTTP/1.1';
protected $url = '';
protected $request_type = '';
protected $lines = '';
protected $fsoket_open = '';
protected $port = '';
protected $errstr = '';
protected $timeout = 0;
protected $parse_url = '';
protected $content_type = '';
protected $content_length = 0;
protected $body = ''; function __construct($url, $request_type = '', $port = 80, $timeout = 5)
{
$this->url = $url;
$this->request_type = $request_type;
$this->port = $port;
$this->timeout = $timeout;
$this->parse_url = parse_url($url);
//链接
$this->connect(); } /*
*设置请求行
* */
public function get()
{
$this->content_type = 'text/html';
$this->lines = $this->request_type . ' ' . $this->parse_url['path'] . ' ' . $this->http_tpye;
$this->request();
} public function post($param)
{
//设置头信息
$this->content_type = 'application/x-www-form-urlencoded';
$data = $this->body_info($param);
$this->content_length = strlen($data);
$this->lines = $this->request_type . ' ' . $this->parse_url['path'] . ' ' . $this->http_tpye;
$this->body = $data;
$this->request();
} public function request()
{
$getinfo = '';
echo $this->lines . "\r\n" . implode("\r\n", $this->header_info()) . " \n\r\n" . $this->body;
exit();
//链接成功进行写入头信息
fwrite($this->fsoket_open, $this->lines . "\n" . implode("\n", $this->header_info()) . "\n\r\n" . $this->body);
while (!feof($this->fsoket_open)) {
$getinfo .= fgets($this->fsoket_open, 1024);
}
fclose($this->fsoket_open);
echo "以下是获取的信息:<br>" . $getinfo;
} /*
* 链接
* */
public function connect()
{
try {
$this->fsoket_open = fsockopen($this->parse_url['host'], $this->port, $this->errstr, $this->timeout);
} catch (Exception $exception) {
echo 'connect is failed :' . $exception->getMessage() . 'r\n' . $this->errstr;
}
} /*
* 设置头信息
* */
public function header_info()
{
return array(
"Host:" . $this->parse_url['host'],
"Content-type:" . $this->content_type,
"Content-length:" . $this->content_length
);
} /*
* 设置主体
* */
public function body_info($param)
{
// 生成 URL-encode 之后的请求字符串
return http_build_query($param);
}
}

PHP+SOCKET 模拟HTTP请求的更多相关文章

  1. Socket模拟HTTP请求

    WEB服务器可以可以理解为socket的上层封装,其也是TCP/IP协议,只要知道其IP地址和端口号就可以与他进行通信了 与WEB服务器数据交互,其重点在于请求头,如果请求头不对则不能进行数据传输 简 ...

  2. socket 模拟 HTTP请求

    一.socket介绍 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层.socket则是对TCP/I ...

  3. Python socket模拟HTTP请求

    0x00 起 最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数.简单的说,就是重写一下requests中的get.post方法. 今天在写的时候,遇到一枚很 ...

  4. Java Socket 模拟HTTP请求

    public static void main(String[] args) { try { String url = "192.168.1.103"; Socket socket ...

  5. PHP socket模拟POST请求

    <?php if (! function_exists ( 'socket_post' )) { function socket_post($url, $data, $referer = '') ...

  6. 【PHPsocket编程专题(实战篇③)】构建基于socket的HTTP请求类

    该代码是两年前写的,现在看起来有点渣了,仅仅是提供一个思路,现在做一些Api开发的时候官方会有一些SDK,这些SDK其实原理都是通过socket来通讯的,其实我个人主张用curl更方便,当然前提是你的 ...

  7. 上curl java 模拟http请求

    最近,我的项目要求java模拟http请求,获得dns解决 tcp处理过的信息特定的连接. java api提供urlConnection apache提供的httpClient都不能胜任该需求,二次 ...

  8. 第五十九节,模拟浏览器请求Python结合html基本格式

    模拟浏览器请求Python结合html基本格式 用Python模拟一个客户端,结合打开一个HTML页面 创建客户端 #!/usr/bin/env python # -*- coding:utf8 -* ...

  9. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

随机推荐

  1. 在oracle里,如何取得本周、本月、本季度、本年度的第一天和最后一天的时间

    在oracle里,如何取得本周.本月.本季度.本年度的第一天和最后一天的时间 --本周 select trunc(sysdate,'d')+1 from dual; select trunc(sysd ...

  2. django的多对一,一对一,多对多关系

    from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) a ...

  3. poj 3590 The shuffle Problem——DP+置换

    题目:http://poj.org/problem?id=3590 bzoj 1025 的弱化版.大概一样的 dp . 输出方案的时候小的环靠前.不用担心 dp 时用 > 还是 >= 来转 ...

  4. nginx相关关键词

    nginx在unix系统中会以daemon(守护进程)方式在后台运行; nginx默认模式是多线程的; nginx会有一个master进程和多个worker进程,master进程主要用来管理worke ...

  5. GOF23设计模式之单例模式(singleton)

    一.单例模式概述 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. 由于单例模式只生成一个实例,减少了系统性能开销.所以当一个对象的产生需要比较多的资源时,如读取配置.产生其他依赖对象时, ...

  6. 1146 Topological Order

    题意:判断序列是否为拓扑序列. 思路:理解什么是拓扑排序就好了,简单题.需要注意的地方就是,因为这里要判断多个,每次判断都会改变入度indegree[],因此记得要把indegree[]留个备份.ps ...

  7. 转:Oracle里几组重要的视图--v$sysstat,v$system_event,v$parameter v$system_parameter

    按组分的几组重要的性能视图 1.System 的 over view v$sysstat , v$system_event  , v$parameter,V$instance得到oracle_sid ...

  8. python学习(九) 魔法方法、属性和迭代器

    9.1 准备工作 python 3.0的所有类都会隐式地成为object的子类. 9.2 构造方法 在python中创建一个构造方法:只要把init方法的名字修改为魔法版本__init__即可. &g ...

  9. log4net 使用总结- (2)在ASP.NET MVC 中使用

    log4net在ASP.NET MVC中的配置,还有一种配置方式,即不在web.config中,而是单独新建一个log4net.config 在根目录下   第一.引用log4net.dll   第二 ...

  10. 免费SSL证书 - Let's Encrypt申请(WINDOWS + IIS版)

    Let’s Encrypt 项目是由互联网安全研究小组ISRG,Internet Security Research Group主导并开发的一个新型数字证书认证机构CA,Certificate Aut ...