首页 / 知识
【php socket通讯】php实现http服务
2023-04-11 15:23:00

http服务是建立在tcp服务之上的,它是tcp/ip协议的应用,前面我们已经实现了tcp服务,并且使用三种不同的方式连接tcp服务
php中连接tcp服务的三种方式
既然http也是tcp应用层的一种,那么我们直接使用浏览器来连接tcp服务可不可以?答案是可以的,只不过连接之后直接返回给浏览器的信息,浏览器不能够正确的识别出来。那么怎么才能让浏览器正确的识别tcp服务返回的信息呢?
这个时候我们就需要使用到http协议啦,至于http传输中都传了哪些信息可以在浏览器中f12查看
目录结构:
http_serv.php文件
<?php
/**
*Http服务器类
*/
classHttp{
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',
);
/**
*@paramstring$host监听地址
*@paramint$port监听端口
*@paramstring$_root网站根目录
*/
publicfunction__construct($host,$port,$_root){
$this->host=$host;
$this->port=$port;
$this->_root=$_root;
}
/**
*启动http服务
*/
publicfunctionstart(){
//创建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);
}
}
}
/**
*组装消息头信息模板
*@paramint$code状态码
*@paramstring$status状态名称
*@paramstring$content发送的文本内容
*@paramstring$content_type发送的内容类型
*@returnstring
**/
publicfunctionGetHeaders($code,$status,$content="",$content_type="text/html;charset=utf-8"){
$header='';
$header.="HTTP/1.1{$code}{$status}\r\n";
$header.="Date:".gmdate('D,dMYH:i:sT')."\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;
}
/**
*组装文本发送信息
*@paramstring$url_path
*@returnstring
**/
publicfunctionGetString($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,"NotFound");
}
}
/**
*组装资源返回信息
*@paramstring$url_path
*@returnstring
**/
publicfunctionGetImg($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,"NotFound");
}
}
/**
*获取资源类型
*@paramstring$path
*@returnmixed
*/
publicfunctiongetMime($path){
$type=explode(".",$path);
$mime=$this->mime_types[$type[1]];
return$mime;
}
/**
*获取访问资源的真实地址
*@param$url_path
*@returnbool|string
*/
publicfunctiongetRealPath($url_path){
returnrealpath($this->_root."/".$url_path);
}
}
$server=newHttp("127.0.0.1",3046,"wwwroot");
$server->start();
效果图:
|
最新内容
相关内容
python和php学哪个做web开发好
python和php学哪个做web开发好,数据,较大,技术,培训,代码,市场,人工智能,行业,份额,网站,不少打算学编程的学生,想从事web开发行业,但是对于webpython http服务怎么搭建
python http服务怎么搭建,服务,培训,环境,进程,命令,端口,后台,不是,终端,开头,在Linux服务器上或安装了Python的机器上,Python自带了一个WEBpython如何比较Python与PHP?
python如何比较Python与PHP?,管理,代码,设计,培训,软件,工具,数据,业务,通用,地方,PHP已经存在很长时间了,而且它还将继续存在,以下是Python迅pythonHTTP与HTTPS之间的区别
pythonHTTP与HTTPS之间的区别,培训,区别,之间,python实现线程安全的单例模式
python实现线程安全的单例模式,培训,线程,模式,pythonPython和php什么关系
pythonPython和php什么关系,设计,培训,网站,公开,地址,平台,概念,通用,项目,语言,python和PHP是两种不同的编程语言,二者没有关系。Python在设python如何实现继承
python如何实现继承,培训,概念,名称,方法,定义,个人,属性,接口,过程,能力,python实现继承的方法:通过继承创建的新类称为“子类”或“派生类”python生成器如何实现
python生成器如何实现,数据,培训,生成器,函数,程序,语句,方法,定义,外部,功能,python生成器实现方法:生成器和迭代器的功能非常相似,它也会提供pythonphp与python一样吗
pythonphp与python一样吗,设计,网站,位置,培训,地方,地址,公开,平台,项目,概念,php和python是不一样的,两种语言有相似的地方,也有区别。PHP即pythonphp哪个有前途
pythonphp哪个有前途,网站,数据,系统,产业,培训,对比,分析,人工智能,工作,发展,无论是对于刚接触编程的初学者,还是已经工作的程序员,哪一门编python如何实现对Python中列表的排
python如何实现对Python中列表的排序?,培训,工作,实例,方法,关键字,对象,函数,以上,列表,表达式,对List进行排序,Python提供了两个方法方法1.python怎么实现模式匹配
python怎么实现模式匹配,培训,时间,代码,算法,字符,模式,复杂度,向量,空间,两个,python通过BF算法实现关键词匹配,BF算法,即暴风(BruteForce)算