【php socket通讯】php实现http服务
2019-07-23 08:41:38来源:博客园 阅读 ()
http服务是建立在tcp服务之上的,它是tcp/ip协议的应用,前面我们已经实现了tcp服务,并且使用三种不同的方式连接tcp服务
php中连接tcp服务的三种方式
既然http也是tcp应用层的一种,那么我们直接使用浏览器来连接tcp服务可不可以?答案是可以的,只不过连接之后直接返回给浏览器的信息,浏览器不能够正确的识别出来。那么怎么才能让浏览器正确的识别tcp服务返回的信息呢?
这个时候我们就需要使用到http协议啦,至于http传输中都传了哪些信息可以在浏览器中 f12 查看
目录结构:
http_serv.php文件
<?php /** * Http 服务器类 */ class Http{ private $host; private $port; private $_root; public $mime_types = array( 'avi' => 'video/x-msvideo', 'bmp' => 'image/bmp', 'css' => 'text/css', 'doc' => 'application/msword', 'gif' => 'image/gif', 'htm' => 'text/html', 'html' => 'text/html', 'ico' => 'image/x-icon', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'js' => 'application/x-javascript', 'mpeg' => 'video/mpeg', 'ogg' => 'application/ogg', 'png' => 'image/png', 'rtf' => 'text/rtf', 'rtx' => 'text/richtext', 'swf' => 'application/x-shockwave-flash', 'wav' => 'audio/x-wav', 'wbmp' => 'image/vnd.wap.wbmp', 'zip' => 'application/zip', ); /** * @param string $host 监听地址 * @param int $port 监听端口 * @param string $_root 网站根目录 */ public function __construct($host,$port,$_root){ $this->host = $host; $this->port = $port; $this->_root = $_root; } /** * 启动http服务 */ public function start(){ //创建socket套接字 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //设置阻塞模式 socket_set_block($socket); //为套接字绑定ip和端口 socket_bind($socket,$this->host,$this->port); //监听socket socket_listen($socket,4); while(true) { //接收客户端请求 if(($msgsocket = socket_accept($socket)) !== false){ //读取请求内容 $buf = socket_read($msgsocket, 9024); preg_match("/\/(.*) HTTP\/1\.1/",$buf,$matchs); preg_match("/Accept: (.*?),/",$buf,$matchss); //获取接收文件类型 $type = explode("/",$matchss[1])[0]; if($type=="text"){ $content = $this->GetString($matchs[1]); }else{ $content = $this->GetImg($matchs[1]); } socket_write($msgsocket,$content,strlen($content)); socket_close($msgsocket); } } } /** * 组装消息头信息模板 * @param int $code 状态码 * @param string $status 状态名称 * @param string $content 发送的文本内容 * @param string $content_type 发送的内容类型 * @return string **/ public function GetHeaders($code,$status,$content="",$content_type="text/html;charset=utf-8"){ $header = ''; $header .= "HTTP/1.1 {$code} {$status}\r\n"; $header .= "Date: ".gmdate('D, d M Y H:i:s T')."\r\n"; $header .= "Content-Type: {$content_type}\r\n"; $header .= "Content-Length: ".strlen($content)."\r\n\r\n";//必须2个\r\n表示头部信息结束 $header .= $content; return $header; } /** * 组装文本发送信息 * @param string $url_path * @return string **/ public function GetString($url_path){ if($this->getRealPath($url_path)){ if(is_readable($this->getRealPath($url_path))){ return $this->GetHeaders(200,"OK",file_get_contents($this->getRealPath($url_path)),$this->getMime($url_path)); }else{ return $this->GetHeaders(401,"Unauthorized"); } }else{ return $this->GetHeaders(404,"Not Found"); } } /** * 组装资源返回信息 * @param string $url_path * @return string **/ public function GetImg($url_path){ if($this->getRealPath($url_path)){ return $this->GetHeaders(200,"OK",file_get_contents($this->getRealPath($url_path)),$this->getMime($url_path)); }else{ return $this->GetHeaders(404,"Not Found"); } } /** * 获取资源类型 * @param string $path * @return mixed */ public function getMime($path){ $type = explode(".",$path); $mime = $this-> mime_types[$type[1]]; return $mime; } /** * 获取访问资源的真实地址 * @param $url_path * @return bool|string */ public function getRealPath($url_path){ return realpath($this->_root."/".$url_path); } } $server = new Http("127.0.0.1",3046,"wwwroot"); $server->start();
效果图:
github地址: https://github.com/enjoysmilehappy/http_server
原文链接:https://www.cnblogs.com/itsuibi/p/11139112.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP写UltraEdit插件脚本实现方法 2020-03-29
- php 带逗号千位符数字的处理方法 2020-03-28
- PHP三元运算符的结合性介绍 2020-03-28
- PHP静态延迟绑定和普通静态效率的对比 2020-03-28
- 基于php流程控制语句和循环控制语句 2020-03-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash