国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php 利用socket發送HTTP請求(GET,POST)

2024-05-04 22:35:08
字體:
來源:轉載
供稿:網友

  今天給大家帶來的是如何利用socket發送GET,POST請求。我借用燕十八老師封裝好的一個Http類給進行說明。

  在日常編程中相信很多人和我一樣大部分時間是利用瀏覽器向服務器提出GET,POST請求,那么可否利用其它方式提出GET,POST請求呢?答案必然是肯定的。了解過HTTP協議的人知道,瀏覽器提交請求的實質是向服務器發送一個請求信息,這個請求信息有請求行,請求頭,請求體(非必須)構成。服務器根據請求信息返回一個響應信息。連接斷開。

   HTTP請求的格式如下所示:

<request-line><headers><blank line>[<request-body>]

  HTTP響應的格式與請求的格式十分相似:

<status-line><headers><blank line>[<response-body>]

  我們可以利用HTTP發送請求的原理,可以重新考慮利用socket發送HTTP請求。

  Socket的英文原義是“孔”或“插座”。通常也稱作“套接字”,用于描述IP地址和端口,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,并綁定到一個端口上,不同的端口對應于不同的服務。如此看來,其實利用socket操作遠程文件和讀寫本地的文件一樣容易,把本地文件看成通過硬件傳輸,遠程文件通過網線傳輸就行了。

  因而可以將發送請求的考慮成 建立連接->打開socket接口(fsockopen())->寫入請求(fwrite())->讀出響應(fread()->關閉文件(fclose())。話不多說,直接上代碼:

<?php interface Proto {  // 連接url  function conn($url);  //發送get查詢  function get();  // 發送post查詢  function post();  // 關閉連接  function close();}class Http implements Proto {  const CRLF = "/r/n";  protected $errno = -1;  protected $errstr = '';  protected $response = '';  protected $url = null;  protected $version = 'HTTP/1.1';  protected $fh = null;  protected $line = array();  protected $header = array();  protected $body = array();  public function __construct($url) {    $this->conn($url);    $this->setHeader('Host: ' . $this->url['host']);  }  // 此方法負責寫請求行  protected function setLine($method) {    $this->line[0] = $method . ' ' . $this->url['path'] . '?' .$this->url['query'] . ' '. $this->version;  }  // 此方法負責寫頭信息  public function setHeader($headerline) {    $this->header[] = $headerline;   }  // 此方法負責寫主體信息  protected function setBody($body) {     $this->body[] = http_build_query($body);  }  // 連接url  public function conn($url) {    $this->url = parse_url($url);    // 判斷端口    if(!isset($this->url['port'])) {      $this->url['port'] = 80;    }    // 判斷query    if(!isset($this->url['query'])) {      $this->url['query'] = '';    }    $this->fh = fsockopen($this->url['host'],$this->url['port'],$this->errno,$this->errstr,3);  }  //構造get請求的數據  public function get() {    $this->setLine('GET');    $this->request();    return $this->response;  }  // 構造post查詢的數據  public function post($body = array()) {       $this->setLine('POST');    // 設計content-type    $this->setHeader('Content-type: application/x-www-form-urlencoded');    // 設計主體信息,比GET不一樣的地方    $this->setBody($body);    // 計算content-length    $this->setHeader('Content-length: ' . strlen($this->body[0]));    $this->request();    return $this->response;  }  // 真正請求  public function request() {    // 把請求行,頭信息,實體信息 放在一個數組里,便于拼接    $req = array_merge($this->line,$this->header,array(''),$this->body,array(''));    //print_r($req);    $req = implode(self::CRLF,$req);     //echo $req; exit;    fwrite($this->fh,$req);    while(!feof($this->fh)) {      $this->response .= fread($this->fh,1024);    }    $this->close(); // 關閉連接  }  // 關閉連接  public function close() {    fclose($this->fh);  }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳春市| 图木舒克市| 巢湖市| 新乐市| 仪陇县| 凤台县| 漳浦县| 永年县| 蒲城县| 淅川县| 清流县| 呈贡县| 绍兴县| 来宾市| 波密县| 闵行区| 金坛市| 申扎县| 乐业县| 广丰县| 厦门市| 龙井市| 台州市| 卓资县| 志丹县| 渝中区| 鹿邑县| 民勤县| 临沭县| 三穗县| 苏尼特左旗| 紫阳县| 达尔| 娱乐| 清原| 天台县| 仁怀市| 调兵山市| 朝阳县| 阳东县| 宣汉县|