这个要通过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?相关推荐

  1. 如何开启php socket,PHP socket的配置及实例

    PHP socket的配置及实例 PHP独特的语法混合了C.Java.Perl以及PHP自创的语法.它可以比CGI或者Perl更快速地执行动态网页.以下是小编为大家搜索整理的PHP socket的配置 ...

  2. 用python开启相机_如何用Python打开realsenseD435相机并获取相机参数

    如何用Python打开realsenseD435相机 import pyrealsense2 as rs import numpy as np import cv2 if __name__ == &q ...

  3. h5 socket.io java,从HTML5 WebSocket到Socket.io

    HTML5 WebSocket 作为新一代的web标准,HTML5为我们提供了很多有用的东西,比如canvas,本地存储(已经分离出去了),多媒体编程接口,当然还有我们的WebSocket.WebSo ...

  4. Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架

    一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket ...

  5. python标准库 对socket二次封装_Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服...

    最近在做的一个项目中需要使用到HTML5中引入的WebSocket技术,本来以为应该很容易就能搞定,谁知道在真正上手开发了以后才发现有很多麻烦的地方,虽然我们是一个以前端开发和设计见长的团队,而且作为 ...

  6. socket.io php 聊天室,WebSocket学习(一)——基于socket.io实现简单多人聊天室

    前言 什么是Websocket呢? 我们都知道在Http协议中,客户端与服务器端的通信是靠客户端发起请求,然后服务器端收到请求再进行回应,这个过程中,客户端是主动的,服务器端是被动的.Websocke ...

  7. pythonsocket自定义协议_Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器...

    最近在做的一个项目中需要使用到HTML5中引入的WebSocket技术,本来以为应该很容易就能搞定,谁知道在真正上手开发了以后才发现有很多麻烦的地方,虽然我们是一个以前端开发和设计见长的团队,而且作为 ...

  8. 有了Socket协议,为什么还要Websocket协议?

    平时我们打开网页,比如购物网站某宝.都是点一下列表商品,跳转一下网页就到了商品详情. 从HTTP协议的角度来看,就是点一下网页上的某个按钮,前端发一次HTTP请求,网站返回一次HTTP响应. 这种由客 ...

  9. php socket链接不上,客户端websocket 无法连接上PHP socket有关问题

    客户端websocket 无法连接上PHP socket问题 本帖最后由 d6965921d 于 2014-07-16 10:25:53 编辑 我客户端是用c++写得websocket 客户端我请求的 ...

最新文章

  1. java web利用mvc结构实现简单聊天室功能
  2. linux x window system下载,为Ubuntu 添加 KDE X WINDOW SYSTEM
  3. Hello World(本博客启程篇)
  4. 深度学习框架zf_谈谈深度学习框架的数据排布
  5. 找高清壁纸,没有那么麻烦,高图网帮你搞定!
  6. [算法]两个栈实现一个队列
  7. 目录下内容的递归复制Linux,linux下递归复制文件及目录
  8. 经过多次试验后第一个成功地实现 HTTPService 与 MXML 之间传递数据,ArrayCollection 与DataGrid 之间成功绑定...
  9. 【优化预测】基于matlab布谷鸟算法优化SVM预测【含Matlab源码 1422期】
  10. Bolt引擎内置的元对象介绍
  11. 杭电(杭州电子科技大学)可视计算基础大作业:绝地求生吃鸡预测
  12. Windows Server 2012 R2 安装 Office2016 和 Visual Studio 2015的问题
  13. rails集成devise
  14. 华为胡厚崑:不让任何一个人在数字世界中掉队
  15. 2022年亚太数学建模竞赛-问题C:全球变暖与否?-思路详解
  16. 易拉罐真的能增强WiFi信号!笔记本手机都适用
  17. 网易云课堂Nodejs笔记(js Function,css,写法)
  18. ZEMAX牛顿望远物镜的优化设计
  19. java契约式编程_契约式设计 Design by contract
  20. 解构微信(二):团队是研究院、艺术中心甚至学校

热门文章

  1. 超链接a标签的伪类选择器问题,Link标签与visited标签的失效问题(问题介绍与解决方法)。以下全部内容跟可通过鼠标左键选取后,复制到编辑器中直接运行。
  2. 【解决】该任务映像已损坏或已篡改。(异常来自HRESULT:0x80041321)
  3. Permission denied (publickey). 解决方法
  4. 一次SocketException:Connection reset 异常排查
  5. jQuery - 通过文本描述设置选择控件的选定值
  6. 从git repo分支安装pip
  7. php inqude函数,Python匿名函数(lambda函数)
  8. MusicPlayer音乐播放器Android
  9. Java代码TkMyBatis通用Mapper中新增数据时同时获取自增主键ID,与适用uuid 做主键时获取 id
  10. Android:最新基于adt-bundle-windows-x86的android开发环境搭建