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

<?php
class Http{
const CRLF = "\r\n";
//把要拼接的内容放在数组里面最后用array_merge和import函数来拼接;
private $line = array(); //请求行
private $url = ''; //url;
private $head = array(); //请求的主体;
private $host = array(); //请求头的主机信息;
private $urlInfo = array(); //pathInfo地址栏的url信息;
private $query = ""; //pathInfo里面的query信息;
private $body = array();
private $fo = null; //socket资源;
private $errno = -1; //socket资源打开的错误代码;
private $errstr = "";//socket资源打开的错误描述; //public $response = "";//返回的响应字符串;
public function __construct($url){
$this->contact($url);
} private function setLine($method){ //设置请求行
$path = isset($this->urlInfo['path']) ? $this->urlInfo['path'] : "/";
$this->line[] = $method . ' ' . $path . $this->query . ' ' . "HTTP/1.1";
} public function setHead($content){ //设置请求头
$this->head[] = $content;
} private function setBody($data){ //请求主体
$bodystr = '';//请求主体的内容;
if (is_array($data)) {
$bodystr = http_build_query($data);
} else {
$bodystr = $data;
}
$this->body[] = $bodystr;
} private function contact($url){ //链接资源句柄
$this->urlInfo = parse_url($url);
$this->host[] = "Host: " . $this->urlInfo['host'];
if (isset($this->urlInfo['query'])) {
$this->query = "?" . $this->urlInfo['query'];
} else {
$this->query = "";
}
$port = isset($this->urlInfo['port']) ? $urlInfo['port'] : 80;//端口;
$this->fo = fsockopen($this->urlInfo['host'] , $port , $this->errno , $this->errstr , 2);
} public function post($data){ //发送post请求
//这里的$data有可能是array的数组,也有可以能是key1=value1&key2=value2这样的字符串;
$this->setLine("POST");
$this->setHead("Content-Type: application/x-www-form-urlencoded");//注意这段话的大小写;
$this->setBody($data);
$strlen = strlen($this->body[0]);
$this->setHead("Content-length: " . $strlen);
$result = array_merge($this->line , $this->host , $this->head , array("") , $this->body , array(""));
$request = implode(self::CRLF , $result);
return $this->response($request);
} public function get(){ //发送get请求
$this->setLine("GET");
$result = array_merge($this->line , $this->host , array("") , array(""));//特别注意,这个地方要空行再空行;
$request = implode(self::CRLF , $result);
return $this->response($request);
} public function response($requestStr){//获取的响应资源;
fputs($this->fo , $requestStr);
$result = "";
while (!feof($this->fo)) {
$result .= fread($this->fo , 1024);
}
$this->close();
return $result;
} public function close(){
fclose($this->fo);
}
}
?>
?>

核心函数:

fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)

通过fsockopen就可以打开一个socket通道,这时候可以使用fwrite或者fputs函数中的任意一个,把http的请求格式发给fsockopen()打开的句柄,这时候一个socket模拟的http请求就完成了.但是还得通过fread函数把响应头给取回来;

【PHPsocket编程专题(实战篇③)】构建基于socket的HTTP请求类的更多相关文章

  1. 【PHPsocket编程专题(实战篇②)】兼容 Curl/Socket/Stream 的 HTTP 操作类[转]

    <?php /************************************************************ * 描述:HTTP操作类 * 作者:heiyeluren ...

  2. 【PHPsocket编程专题(实战篇①)】php-socket通信演示

    建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket . 套接字之间的连接过程分为三个步骤:服务器监听,客户 ...

  3. 【PHPsocket编程专题(理论篇)】初步理解TCP/IP、Http、Socket.md

    前言 我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API).那TCP/IP又是什么呢?TCP/IP是ISO/OS ...

  4. 基于socket实现http请求

    异步非阻塞模块原理 # 基于socket实现http请求 import socket # 多路IO复用模块 import select socket_list= [] url_list = [&quo ...

  5. 【局域网聊天客户端篇】基于socket与Qt

    前言 暑假把linux下的高级编程和网络编程学习了一遍,学习很重要,但是也得有个练手的地方,所以必须做做项目来认识下自己所学习的知识. 能够找到小伙伴一起做项目也是一件很快乐的事情的,很幸运的有两个小 ...

  6. Pyhont 网络编程【第一篇】初始Socket网络套接字

    一.什么是socket: Socket 别名 “网络套接字”,指网络通信链句柄 其实就是一堆网络信息(ip+端口) 建立起的链接称之为socket,Socket的英文原义是“孔”或“插座”,用来实现不 ...

  7. 微信小程序实战篇:基于wxcharts.js绘制移动报表

    前言 微信小程序图表插件(wx-charts)是基于canvas绘制,体积小巧,支持图表类型饼图.线图.柱状图 .区域图等图表图形绘制,目前wx-charts是微信小程序图表插件中比较强大好使的一个. ...

  8. 【Selenium-WebDriver实战篇】基于java的selenium之验证码识别内容

    ==================================================================================================== ...

  9. 一个基于Socket的http请求监听程序实现

    首先来看以下我们的需求: 用java编写一个监听程序,监听指定的端口,通过浏览器如http://localhost:7777来访问时,可以把请求到的内容记录下来,记录可以存文件,sqlit,mysql ...

随机推荐

  1. 读取XML

    public sealed class ConfigManger { public XDocument XmlDocs { set; get; } string path = @"{0}\C ...

  2. C#操作系统日志

    系统日志可以帮助我们分析操作系统的安全与否,也可以帮助我们将一些不好调试的信息显示出来. C#操作系统日志主要是通过EventLog类来实现的. 一 图解 打开事件查看器,其中与EventLog类对应 ...

  3. 免费GIT托管

    http://www.gitcentral.com http://www.projectlocker.com http://gitfarm.appspot.com http://code.google ...

  4. Extjs combox的详解

    Extjs combox的详解 写了哈extjs当中的combox,第一次写,照着网上的例子抄.在上次的例子中,是实现了,可是有一个重大的错误.也就是自己根本没有理解combox从远程服务器获取数据, ...

  5. DevExpress12.2.6 安装顺序记录

    环境DelphiXE,实测DevExpress手工安装顺序: 1.ExpressCore Library 2.XP Theme Manager 3.ExpressGDI+ Library 4.Expr ...

  6. Python-Day9 Paramiko模块/进程/线程/RabbitMQ队列

    一.Paramiko模块 1.Paramiko安装 Python的目录下有个Scripts目录,cd到这个目录用这里面的pip命令(如果添加的环境变量可以在cmd直接输入命令):pip install ...

  7. linux设备驱动模型

    尽管LDD3中说对多数程序员掌握设备驱动模型不是必要的,但对于嵌入式Linux的底层程序员而言,对设备驱动模型的学习非常重要. Linux设备模型的目的:为内核建立一个统一的设备模型,从而又一个对系统 ...

  8. iOS 进阶 第七天(0403)

    0403 QQ列表展开收起的原理 更改 numbersOfRowsInSection 的返回的数目,为0则收起group,不为零则为展开.先修改模型数据 刷新对应的表格 代码如下: 这个地方会出现一个 ...

  9. 20145120黄玄曦 《java程序设计》 寒假学习总结

    1和2.我对未来规划不多,我认为好好学习积累知识能帮助我应对未来的挑战,这是我的学习动力之一,此外,了解新知识满足好奇心也是我的主要的学习动力. 3.我认为专业课学习比公务员考试重要,我认为专业知识是 ...

  10. 线性判别分析(LDA), 主成分分析(PCA)及其推导【转】

    前言: 如果学习分类算法,最好从线性的入手,线性分类器最简单的就是LDA,它可以看做是简化版的SVM,如果想理解SVM这种分类器,那理解LDA就是很有必要的了. 谈到LDA,就不得不谈谈PCA,PCA ...