使用scoket傳送HTTP請求

2021-08-03 19:36:19 字數 2740 閱讀 6902

建議先看一下如何用telnet傳送http請求:

/***此方法負責寫請求行

*如 get /index.php http/1.1

*/private function setline($method)

/***此方法負責寫頭資訊

*如host: localhost

*/public function setheader($key,$value)

/***此方法負責寫post主體資訊

*key=value的形式寫進陣列

*用http_build_query()封裝成key1=value1&key2=value2

*/public function setbody($key,$value)

/***用fsockopen開啟網路連線

*就像telnet 192.168.0.0 80

*/private function conn($url)

//如果url沒有path,則預設根路徑'/'

//如www.baidu.com沒有path

//如為/sports

if(!isset($this->url['path']))

if(!isset($this->url['query']))else

//開啟網路連線

$this->fh = fsockopen($this->url['host'],$this->url['port'],$this->errno,$this->errstr,3);

if(!$this->fh)

}public function get()

public function post()

/***拼接請求資訊,並寫入response

*/private function request()

$this->close();

}/**

*關閉socket連線

*/public function close()

}//get請求

//post請求

// $http->setbody('submit','提交');

?>為什麼要在頭資訊設定connection:close

如果不設定connection:close,會發現速度非常慢,feof不能準確判斷是否已經得到了所有的資料,直到超過設定的超時時間才結束。

connection的狀態有兩種,一種是keep-alive 另外一種就是close。

keep-alive就是保持客戶端與伺服器的連線,這是預設的方式。

close表示伺服器給客戶端傳送資訊之後就斷開了,.close對資源消耗占用的少一些。

再完善一點,其實這和tcp三次握手有關,如果返回的是keep-alive表示之前的握手還可以用在接下來的請求當中去,如果是close的話當前請求完成後會進行四次握手關閉連線,在接下來的請求就要重新握手,這是http/1.1相對1.0新增的乙個部分,加快了網路傳輸。

->setheader('cookie','***x');//自己的cookie

->setbody('pmsubmit_btn','傳送');

利用fsockopen模擬HTTP傳送請求

首先檢查php.ini 中 allow url fopen 選項是否開啟,需要開啟 get 方式傳送請求 fp fsockopen localhost 80,errno,errstr,10 host 埠 錯誤碼 錯誤訊息 超時時間 請求行 http get http server.php?use 1...

springBoot自帶的傳送HTTP請求的API

springboot管理的專案,自動傳送http請乙個自動網頁獲取鏈結,首先考慮到用httpclient api,經同事指點用了springboot自帶的api,非常簡潔,兩行 如下。resttemplate resttemplate new resttemplate string forobjec...

使用requests傳送get post請求

首先是安裝requests庫 pip install requests 匯入requests庫 import requests 定義乙個url 入參直接寫在url內,使用問號隔開 url test 返回的資料定義為r url賦值為之前定義的值 r requests.get url url test ...