【php socket通讯】php实现http服务
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
【php socket通讯】php实现http服务的更多相关文章
- TCP Socket 通讯(客户端与服务端)
/*----------------------------编译环境:VS2015---------------------------------------*/ /*--------------- ...
- java socket 多线程通讯 使用mina作为服务端
客户端代码不变,参照 http://www.cnblogs.com/Westfalen/p/6251473.html 服务端代码如下: import java.io.IOException; impo ...
- 闲来无事,写个基于TCP协议的Socket通讯Demo
.Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...
- 试解析Tomcat运行原理(一)--- socket通讯
关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...
- Android笔记:Socket通讯常见问题
经验证的socket通讯问题 1.如果是模拟器和本机PC直接通讯,需要使用本机IP地址 而不是 10.0.2.2 如本机的静态地址为192.168.1.2 则直接使用该地址 2.接收和连接代码不能在 ...
- java socket通讯(二)处理多个客户端连接
通过java socket通讯(一) 入门示例,就可以实现服务端和客户端的socket通讯,但是上一个例子只能实现一个服务端和一个客户端之间的通讯,如果有多个客户端连接服务端,则需要通过多线程技术来实 ...
- java socket通讯(一) 入门示例
一.入门 要想学习socket通讯,首先得知道tcp/ip和udp连接,具体可参考浅谈TCP/IP 和 UDP的区别 二.示例 首先新建了一个java工程,包括两个部分,客户端SocketClient ...
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯
Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...
- .Net中的Socket通讯
.NetFrameWork为Socket通讯提供了System.Net.Socket命名空间,在这个命名空间里面有以下几个常用的重要类分别是: ·Socket类 这个低层的类用于管理连接,WebReq ...
- c#写个基础的Socket通讯
晚上想写点东西,想想把我刚来公司学的Sockt通讯写上来吧.要写的简单易懂点,新人们可以借鉴下哦,用控制台写. 先得说说Socket,与TCP/UDP啥关系,一直讲什么Socket通讯,TCP通讯,都 ...
随机推荐
- Java并发包线程池之ForkJoinPool即ForkJoin框架(二)
前言 前面介绍了ForkJoinPool相关的两个类ForkJoinTask.ForkJoinWorkerThread,现在开始了解ForkJoinPool.ForkJoinPool也是实现了Exec ...
- Bitmap添加水印效果
package com.loaderman.customviewdemo; import android.app.Activity; import android.graphics.Bitmap; i ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_13-细粒度授权-细粒度授权介绍
3 细粒度授权 3.1 需求分析 什么是细粒度授权? 细粒度授权也叫数据范围授权,即不同的用户所拥有的操作权限相同,但是能够操作的数据范围是不一样的.一个 例子:用户A和用户B都是教学机构,他们都拥有 ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_11-前端集成认证授权-身份校验
把下面赋值到nginx中 前端的服务需要配置一下 重启nginx 启动教学管理的前端 没有登陆直接就进来教学管理的后端了 下面我们要做的就是这两件事 1.前端页面校验用户的身份,如果用户没有登录则跳转 ...
- 阶段5 3.微服务项目【学成在线】_day07 课程管理实战_05-课程修改实战分析
3 课程信息修改 3.1 需求分析 课程添加成功进入课程管理页面,通过课程管理页面修改课程的基本信息.编辑课程图片.编辑课程营销信息等. 本小节实现修改课程. 3.2 课程管理页面说明 3.2.1 页 ...
- golang web框架 beego 学习 (七)json转数组
Modules type User struct { Id int64 `json:"id"` Name string `json:"name"` Email ...
- laydate年份选择,关闭底框,点击指定年份就选择然后关闭控件,翻页不选择也不关闭控件
如下图,翻页不选择也不关闭.点击指定年份时再选择和关闭控件 代码如下 // 默认没有选择,把判断赋值当前时间 var iYearCode = parseInt(new Date().getFullYe ...
- python 字典dict - python基础入门(15)
前面的课程讲解了字符串str/列表list/元组tuple,还有最后一种比较重要的数据类型也需要介绍介绍,那就是python字典,俗称:dict. python中的字典可与字符串/列表/元组不同,因为 ...
- 表单绑定 v-model
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- [转帖]linux下查找文件及查找包含指定内容的文件常用命令。
linux下查找文件及查找包含指定内容的文件常用命令. https://blog.csdn.net/yangyu19910407/article/details/18266821 最简单的查找 fin ...