如何开启php socket,如何用php实现websocket?
这个要通过cmd运行的 具体带的参数有点忘记了
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
//创建一个socket连接 设置参数 绑定 监听 并且返回
$master = WebSocket("localhost",12345);
//标示是否已经进行过握手了
$is_shaked = false;
//是否已经关闭
$is_closed = true;
//将socket变为一个可用的socket
while(true){
//如果是关闭状态并且是没有握手的话 则创建一个可用的socket(貌似第二个条件可以去除)
if($is_closed && !$is_shaked){
if(($sock = socket_accept($master)) < 0){
echo "socket_accept() failed: reason: " . socket_strerror($sock) . "\n";
}
//将关闭状态修改为false
$is_closed = false;
}
//开始进行数据处理
process($sock);
}
//处理请求的函数
function process($socket){
//先从获取到全局变量
global $is_closed, $is_shaked;
//从socket中获取数据
$buffer = socket_read($socket,2048);
//如果buffer返回值为false并且已经握手的话 则断开连接
if(!$buffer && $is_shaked){
disconnect($socket);
}else{
//如果没有握手的话则握手 并且修改握手状态
if($is_shaked == false){
$return_str = dohandshake($buffer);
$is_shaked = true;
}else{
//如果已经握手的话则送入deal函数中进行相应处理
$data_str = decode($buffer); //解析出来的从前端送来的内容
console($data_str);
$return_str = encode(deal($socket, $data_str));
//$return_str = encode($data_str);
}
//将应该返回的字符串写入socket返回
socket_write($socket,$return_str,strlen($return_str));
}
}
function deal($socket, $msgObj){
$obj = json_decode($msgObj);
foreach($obj as $key=>$value){
if($key == 'close'){
disconnect($socket);
console('close success');
return 'close success';
}else if($key == 'msg'){
console($value."\n");
return $value;
}
}
}
//获取头部信息
function getheaders($req){
$r=$h=$o=null;
if(preg_match("/GET (.*) HTTP/" ,$req,$match)){ $r=$match[1]; }
if(preg_match("/Host: (.*)\r\n/" ,$req,$match)){ $h=$match[1]; }
if(preg_match("/Origin: (.*)\r\n/",$req,$match)){ $o=$match[1]; }
if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$req,$match)){ $key=$match[1]; }
if(preg_match("/\r\n(.*?)\$/",$req,$match)){ $data=$match[1]; }
return array($r,$h,$o,$key,$data);
}
function WebSocket($address,$port){
$master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() failed");
socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1) or die("socket_option() failed");
socket_bind($master, $address, $port) or die("socket_bind() failed");
socket_listen($master,20) or die("socket_listen() failed");
echo "Server Started : ".date('Y-m-d H:i:s')."\n";
echo "Master socket : ".$master."\n";
echo "Listening on : ".$address." port ".$port."\n\n";
return $master;
}
function dohandshake($buffer){
list($resource,$host,$origin,$key,$data) = getheaders($buffer);
echo "resource is $resource\n";
echo "origin is $origin\n";
echo "host is $host\n";
echo "key is $key\n\n";
$response_key = base64_encode(sha1($key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
$return_str = "HTTP/1.1 101 Switching Protocols\r\n".
"Upgrade: websocket\r\n".
"Connection: Upgrade\r\n".
"Sec-WebSocket-Accept: $response_key\r\n\r\n";
return $return_str;
}
function console($msg){
$msg = transToGBK($msg);
echo "$msg\n";
return $msg;
}
function decode($msg="") {
$mask = array();
$data = "";
$msg = unpack("H*",$msg);
$head = substr($msg[1],0,2);
if (hexdec($head{1}) === 8){
$data = false;
} else if (hexdec($head{1}) === 1){
$mask[] = hexdec(substr($msg[1],4,2));
$mask[] = hexdec(substr($msg[1],6,2));
$mask[] = hexdec(substr($msg[1],8,2));
$mask[] = hexdec(substr($msg[1],10,2));
$s = 12;
$e = strlen($msg[1])-2;
$n = 0;
for ($i= $s; $i<= $e; $i+= 2){
$data .= chr($mask[$n%4]^hexdec(substr($msg[1],$i,2)));
$n++;
}
}
return $data;
}
function encode($msg=""){
$frame = array();
$frame[0] = "81";
$msg .= ' is ok';
$len = strlen($msg);
$frame[1] = $len<16?"0".dechex($len):dechex($len);
$frame[2] = ord_hex($msg);
$data = implode("",$frame);
return pack("H*", $data);
}
function transToGBK($s){//UTF8->GBK
//echo $s;
return iconv("UTF-8", "GBK", $s);
return $s;
}
function ord_hex($data){
$msg = "";
$l = strlen($data);
for ($i=0; $i
//ord是返回字符串第一个字符的ascii值
//dechex把十进制转换为十六进制
$msg .= dechex(ord($data{$i}));
}
return $msg;
}
function disconnect($socket){
global $is_shaked, $is_closed;
$is_shaked = false;
$is_closed = true;
socket_close($socket);
}
?>
如何开启php socket,如何用php实现websocket?相关推荐
- 如何开启php socket,PHP socket的配置及实例
PHP socket的配置及实例 PHP独特的语法混合了C.Java.Perl以及PHP自创的语法.它可以比CGI或者Perl更快速地执行动态网页.以下是小编为大家搜索整理的PHP socket的配置 ...
- 用python开启相机_如何用Python打开realsenseD435相机并获取相机参数
如何用Python打开realsenseD435相机 import pyrealsense2 as rs import numpy as np import cv2 if __name__ == &q ...
- h5 socket.io java,从HTML5 WebSocket到Socket.io
HTML5 WebSocket 作为新一代的web标准,HTML5为我们提供了很多有用的东西,比如canvas,本地存储(已经分离出去了),多媒体编程接口,当然还有我们的WebSocket.WebSo ...
- Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架
一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket ...
- python标准库 对socket二次封装_Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服...
最近在做的一个项目中需要使用到HTML5中引入的WebSocket技术,本来以为应该很容易就能搞定,谁知道在真正上手开发了以后才发现有很多麻烦的地方,虽然我们是一个以前端开发和设计见长的团队,而且作为 ...
- socket.io php 聊天室,WebSocket学习(一)——基于socket.io实现简单多人聊天室
前言 什么是Websocket呢? 我们都知道在Http协议中,客户端与服务器端的通信是靠客户端发起请求,然后服务器端收到请求再进行回应,这个过程中,客户端是主动的,服务器端是被动的.Websocke ...
- pythonsocket自定义协议_Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器...
最近在做的一个项目中需要使用到HTML5中引入的WebSocket技术,本来以为应该很容易就能搞定,谁知道在真正上手开发了以后才发现有很多麻烦的地方,虽然我们是一个以前端开发和设计见长的团队,而且作为 ...
- 有了Socket协议,为什么还要Websocket协议?
平时我们打开网页,比如购物网站某宝.都是点一下列表商品,跳转一下网页就到了商品详情. 从HTTP协议的角度来看,就是点一下网页上的某个按钮,前端发一次HTTP请求,网站返回一次HTTP响应. 这种由客 ...
- php socket链接不上,客户端websocket 无法连接上PHP socket有关问题
客户端websocket 无法连接上PHP socket问题 本帖最后由 d6965921d 于 2014-07-16 10:25:53 编辑 我客户端是用c++写得websocket 客户端我请求的 ...
最新文章
- java web利用mvc结构实现简单聊天室功能
- linux x window system下载,为Ubuntu 添加 KDE X WINDOW SYSTEM
- Hello World(本博客启程篇)
- 深度学习框架zf_谈谈深度学习框架的数据排布
- 找高清壁纸,没有那么麻烦,高图网帮你搞定!
- [算法]两个栈实现一个队列
- 目录下内容的递归复制Linux,linux下递归复制文件及目录
- 经过多次试验后第一个成功地实现 HTTPService 与 MXML 之间传递数据,ArrayCollection 与DataGrid 之间成功绑定...
- 【优化预测】基于matlab布谷鸟算法优化SVM预测【含Matlab源码 1422期】
- Bolt引擎内置的元对象介绍
- 杭电(杭州电子科技大学)可视计算基础大作业:绝地求生吃鸡预测
- Windows Server 2012 R2 安装 Office2016 和 Visual Studio 2015的问题
- rails集成devise
- 华为胡厚崑:不让任何一个人在数字世界中掉队
- 2022年亚太数学建模竞赛-问题C:全球变暖与否?-思路详解
- 易拉罐真的能增强WiFi信号!笔记本手机都适用
- 网易云课堂Nodejs笔记(js Function,css,写法)
- ZEMAX牛顿望远物镜的优化设计
- java契约式编程_契约式设计 Design by contract
- 解构微信(二):团队是研究院、艺术中心甚至学校
热门文章
- 超链接a标签的伪类选择器问题,Link标签与visited标签的失效问题(问题介绍与解决方法)。以下全部内容跟可通过鼠标左键选取后,复制到编辑器中直接运行。
- 【解决】该任务映像已损坏或已篡改。(异常来自HRESULT:0x80041321)
- Permission denied (publickey). 解决方法
- 一次SocketException:Connection reset 异常排查
- jQuery - 通过文本描述设置选择控件的选定值
- 从git repo分支安装pip
- php inqude函数,Python匿名函数(lambda函数)
- MusicPlayer音乐播放器Android
- Java代码TkMyBatis通用Mapper中新增数据时同时获取自增主键ID,与适用uuid 做主键时获取 id
- Android:最新基于adt-bundle-windows-x86的android开发环境搭建