您的位置:首页 > 理论基础 > 计算机网络

php利用socket函数模拟发送http请求

2014-11-13 11:30 465 查看
[php] view
plaincopy

<?php  

  

/* 

* Network: HTTP request object* Author: Li HouYu (Karajan Lee), Shanghai, China. 

*/  

class HttpRequest{  

          private $sHostAdd;//服务器ip  

          private $sUri;//请求的文件  

          private $iPort;//服务器端口  

          private $sRequestHeader;//请求头信息  

          private $sResponse;//请求信息  

          

        //构造函数  

      function __construct($sUrl){  

          $sPatternUrlPart = '/http:\/\/([a-z-\.0-9]+)(:(\d+)){0,1}(.*)/i';  

          $arMatchUrlPart = array();  

          preg_match($sPatternUrlPart, $sUrl, $arMatchUrlPart);  

          $this->sHostAdd = gethostbyname($arMatchUrlPart[1]);  

          if (empty($arMatchUrlPart[4])){  

            $this->sUri = '/';  

          }else{  

            $this->sUri = $arMatchUrlPart[4];  

          }  

          if (empty($arMatchUrlPart[3])){  

            $this->iPort = 80;  

          }else{  

            $this->iPort = $arMatchUrlPart[3];  

          }  

          $this->addRequestHeader('Host: '.$arMatchUrlPart[1]);  

          $this->addRequestHeader('Connection: Close');  

      }  

        

        

      //添加头信息  

      function addRequestHeader($sHeader){  

         $this->sRequestHeader .= trim($sHeader)."\r\n";  

      }  

        

      //发送请求  

      function sendRequest($sMethod = 'GET', $sPostData = ''){  

          $sRequest = $sMethod." ".$this->sUri." HTTP/1.1\r\n";  

          $sRequest .= $this->sRequestHeader;  

          if ($sMethod == 'POST'){  

              $sRequest .= "Content-Type: application/x-www-form-urlencoded\r\n";  

              $sRequest .= "Content-Length: ".strlen($sPostData)."\r\n";  

              $sRequest .= "\r\n";  

              $sRequest .= $sPostData."\r\n";  

          }  

          $sRequest .= "\r\n";  

          $sockHttp = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);  

          if (!$sockHttp){  

            die('socket_create() failed!');  

          }  

          $resSockHttp = socket_connect($sockHttp, $this->sHostAdd, $this->iPort);  

          if (!$resSockHttp){  

            die('socket_connect() failed!');  

          }  

          socket_write($sockHttp, $sRequest, strlen($sRequest));  

          $this->sResponse = '';  

          while ($sRead = socket_read($sockHttp, 4096)){  

            $this->sResponse .= $sRead;  

          }  

          socket_close($sockHttp);  

      }  

        

      //获取响应  

      function getResponse(){  

        return $this->sResponse;  

      }  

        

      //获取响应正文  

      function getResponseBody(){  

          $sPatternSeperate = '/\r\n\r\n/';  

          $arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);  

          return $arMatchResponsePart[1];  

      }  

        

      //获取响应头  

      function getResponseHead(){  

          $sPatternSeperate = '/\r\n\r\n/';  

          $arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);  

          return $arMatchResponsePart[0];  

      }  

}  

  

  

$url='http://www.baidu.com';  

$httpRequest=new HttpRequest($url);  

$httpRequest->sendRequest();  

file_put_contents('temp.txt',$httpRequest->getResponse());  

echo $httpRequest->getResponseBody();  

  

  

  

?>  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: