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请求

接口

  1. **
  2. * Interface php_socket
  3. */
  4. interface php_socket
  5. {
  6. /**
  7. * @return mixed
  8. */
  9. public function get();
  10.  
  11. /**
  12. * @return mixed
  13. */
  14. public function post($param);
  15.  
  16. /**
  17. * @return mixed
  18. */
  19. public function request();
  20.  
  21. /**
  22. * @return mixed
  23. */
  24. public function header_info();
  25.  
  26. /**
  27. * @return mixed
  28. */
  29. public function body_info($param);
  30.  
  31. /**
  32. * @return mixed
  33. */
  34. public function connect();
  35. }

实现接口

  1. class implement_socket implements php_socket
  2. {
  3. protected $http_tpye = 'HTTP/1.1';
  4. protected $url = '';
  5. protected $request_type = '';
  6. protected $lines = '';
  7. protected $fsoket_open = '';
  8. protected $port = '';
  9. protected $errstr = '';
  10. protected $timeout = 0;
  11. protected $parse_url = '';
  12. protected $content_type = '';
  13. protected $content_length = 0;
  14. protected $body = '';
  15.  
  16. function __construct($url, $request_type = '', $port = 80, $timeout = 5)
  17. {
  18. $this->url = $url;
  19. $this->request_type = $request_type;
  20. $this->port = $port;
  21. $this->timeout = $timeout;
  22. $this->parse_url = parse_url($url);
  23. //链接
  24. $this->connect();
  25.  
  26. }
  27.  
  28. /*
  29. *设置请求行
  30. * */
  31. public function get()
  32. {
  33. $this->content_type = 'text/html';
  34. $this->lines = $this->request_type . ' ' . $this->parse_url['path'] . ' ' . $this->http_tpye;
  35. $this->request();
  36. }
  37.  
  38. public function post($param)
  39. {
  40. //设置头信息
  41. $this->content_type = 'application/x-www-form-urlencoded';
  42. $data = $this->body_info($param);
  43. $this->content_length = strlen($data);
  44. $this->lines = $this->request_type . ' ' . $this->parse_url['path'] . ' ' . $this->http_tpye;
  45. $this->body = $data;
  46. $this->request();
  47. }
  48.  
  49. public function request()
  50. {
  51. $getinfo = '';
  52. echo $this->lines . "\r\n" . implode("\r\n", $this->header_info()) . " \n\r\n" . $this->body;
  53. exit();
  54. //链接成功进行写入头信息
  55. fwrite($this->fsoket_open, $this->lines . "\n" . implode("\n", $this->header_info()) . "\n\r\n" . $this->body);
  56. while (!feof($this->fsoket_open)) {
  57. $getinfo .= fgets($this->fsoket_open, 1024);
  58. }
  59. fclose($this->fsoket_open);
  60. echo "以下是获取的信息:<br>" . $getinfo;
  61. }
  62.  
  63. /*
  64. * 链接
  65. * */
  66. public function connect()
  67. {
  68. try {
  69. $this->fsoket_open = fsockopen($this->parse_url['host'], $this->port, $this->errstr, $this->timeout);
  70. } catch (Exception $exception) {
  71. echo 'connect is failed :' . $exception->getMessage() . 'r\n' . $this->errstr;
  72. }
  73. }
  74.  
  75. /*
  76. * 设置头信息
  77. * */
  78. public function header_info()
  79. {
  80. return array(
  81. "Host:" . $this->parse_url['host'],
  82. "Content-type:" . $this->content_type,
  83. "Content-length:" . $this->content_length
  84. );
  85. }
  86.  
  87. /*
  88. * 设置主体
  89. * */
  90. public function body_info($param)
  91. {
  92. // 生成 URL-encode 之后的请求字符串
  93. return http_build_query($param);
  94. }
  95. }

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. LA2218 Triathlon

    题意 PDF 分析 设出长度\(x,y,1-x-y\),就是关于它们的二元一次不等式,判断有没有解. 可以用半平面交来解决. x/V[i]+y/U[i]+(1-x-y)/W[i] < x/V[j ...

  2. 【Xamarin 】MonoTouch - UIImageView响应点击事件

    //圆角头像 UIImageView _avatarView = new UIImageView(new RectangleF(_blockSpace, _blockSpace, 2 * _avata ...

  3. yii2史上最简单式安装教程,没有之一(转)

    测试说明:按照文章下载文件,虽然是tgz文件,用winrar解压,在CMD中运行init.bat文件. 既然是安装Yii,我们先去官网下载一份Yii的高级模版,什么,你说打开页面乱七八糟的英文字母你看 ...

  4. ecmall在linux下的安装注意事项(转) ----ecmall系统迁移

    linux+apache+mysql+php,然后自己开始在linux下安装ecmall并做迁移,整理了一下中间碰到的问题.1.系统选择的环境是centos6.3,安装不做介绍. 2.安装 MySQL ...

  5. PHP实现同服务器多个二级域名共享 SESSion

    现在很多分类信息网站都会分出很多个二级域名出来,比如:sh.ganji.com(上海赶集网), su.ganji.com(苏州赶集网)等等,像这种拥有多个二级域名的网站,该如何实现同步共享sessio ...

  6. delphi 理解ParamStr

    delphi 理解ParamStr 演示代码如下 ::code procedure TForm1.FormCreate(Sender: TObject); var   i: Integer; begi ...

  7. simple_one_for_one 和 one_for_one的区别

    参考这里http://blog.sina.com.cn/s/blog_77cb45a70102v1ja.html 用起来最直观的不同点 simple_one_for_one需要手工start_chil ...

  8. Java-Maven-Runoob:Maven NetBeans

    ylbtech-Java-Maven-Runoob:Maven NetBeans 1.返回顶部 1. Maven NetBeans NetBeans 6.7 及更新的版本已经内置了 Maven.对于以 ...

  9. AD9如何设置原点位置

    Edit --> Origin --> Set

  10. EF中新建表和关联表的方法

    以机场表为例 private static AIRPORT_HELIPORTManager AirportHeliportManager => ManagerFactory.Instance.A ...