### 概述
websocket是html5提出的一个 协议 规范,由html5提供一种浏览器和服务器之间的全双工通信网络技术。
Websocket通信协议与2011年被IETF定为标准RFC 6455,Websocket Api被W3C定为标准。
全双工,是通讯传输的一个术语,通信允许数据在两个方向上同时传输。相当于高速公路或打电话。
单工或半双工,是指一个时间段内只有一个动作发生。相当于汽车单行道或对讲机
协议名:ws
### WebSocket优越性
以前不管使用HTTP轮询或使用TCP长连接等方式制作即实消息系统,都有着天然的缺陷,随着HTML5的兴起,其
中有一个新的协议Websocket Protocol,可以实现浏览器与服务器全双工通信,它可以做到:通过一个握手的机
制,客户端(浏览器)和服务器(webserver)之间能建立一个类似tcp的连接,从而方便【客户端】-【服务
端】之间的通信。两者之是就直接可以数据互相传送,这个新的协议的特点正好适合这种即时通信 .
### Websocket协议实现方式:
它是一长链接,只能通过一次请求来初始化链接,然后所有的请求和响应都是通过这个连接进行通讯,这意味着它
是一种基于事件驱动,异步的消息机制。只需要一个握手动作,就可以形成一条快速的通道.
### 握手协议
在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” (handshaking) .
![](https://box.kancloud.cn/33ab6f3e48a7f4ee715ba24b85d4a892_992x355.png)
### 浏览器发送请求
因为websocket已是html5自身就有可以在js中直接实例化来使用 .
~~~
var webSocket = new WebSocket("ws://localhost:9000")
~~~
### 服务端返回请求
在websocket协议规范中规定,Sec-WebSocket-Version大于等于13之后加密返回的Sec-WebSocket-Accept将进行如下的操作 :
GUID(协议规定的一个固定值):258EAFA5-E914-47DA-95CA-C5AB0DC85B11
加密过程 :
客户端上报的Sec-WebSocket-Key的值拼接上GUID【258EAFA5-E914-47DA-95CA-C5AB0DC85B11】,拿这个字符串做sha1计算,然后再把得到的结果通过base64加密,最后再返回给客户端 .
~~~
base64_encode(sha1("2SCVXUeP9cTjV+0mWB8J6A==" . "258EAFA5‐E914‐47DA‐95CA‐C5AB0DC85B11"), true));
~~~
Sec-WebSocket-Key此值需要通过如正则来获取
~~~
/**
* @param $header 客户端头信息
* @param $activeSocket 客户端的socket对象
*/
function handshaking($header, $activeSocket) {
preg_match("/Sec\‐WebSocket\‐Key:\ (.+)\r\n/", $header, $matchs);
$key = base64_encode(sha1($matchs[1] . "258EAFA5‐E914‐47DA‐95CA‐C5AB0DC85B11", true));
$head = "HTTP/1.1 101 Switching Protocols\r\n";
$head .= "Upgrade: websocket\r\n"; // 告诉这个websocket客户端可以把这个协议升级为websocket协议
$head .= "Connection: Upgrade\r\n"; // 升级这个通信协议
$head .= "Sec‐WebSocket‐Accept: {$key}\r\n\r\n"; // 最后的一定要有两个回车
// 握手响应协议信息返回给浏览器
socket_write($activeSocket, $head);
}
~~~
完成此步骤,浏览器和服务器之间的握手操作就完成,后就可以进行相互的通信操作。
- PHP加密技术
- md5加密
- Crypt加密
- 函数
- 概述
- 强类型参数
- 可变参数列表
- 值传递&引用传递
- 变量作用域
- 可变函数
- 嵌套函数
- 递归函数
- 匿名函数(闭包)
- 面向对象
- 概念
- 类
- 对象的传值
- 对象的克隆
- 构造方法
- 析构方法
- 克隆方法
- $this
- 类常量
- 静态属性
- 静态方法
- 继承
- 重写
- 重载
- 概述
- 属性重载
- 概述
- __set()
- __get()
- __unset()
- __isset()
- 方法重载
- 概述
- __call()
- __callstatic()
- 封装
- 最终类
- 抽象类
- 接口
- 对象的序列化与反序列化
- __sleep()
- __wakeup()
- 其他魔术方法
- 对象的遍历
- 类和对象相关函数
- 错误
- 概述
- 设置错误级别
- trigger_error()触发错误
- 处理PHP中的错误
- 异常
- 概述
- 自定义异常类
- 自定义文件写入异常类
- 记录和发送异常信息
- 使用观察者模式处理异常信息
- 自定义异常处理器
- 设计模式
- 创建型
- 单例模式
- 工厂模式
- 原型模式
- 结构型
- 注册树模式
- 适配器模式
- 数据映射模式
- 装饰器模式
- 代理模式
- 行为型
- 策略模式
- 观察者模式
- 迭代器模式
- 网络
- cURL
- Oauth2.0
- QQ第三方登录
- TCP/IP协议
- 概述
- HTTP协议
- 概述
- HTTP请求协议
- HTTP响应协议
- WebSocket
- 安装扩展
- Redis
- Socket
- 计算机通信
- socket简介
- PHP操作socket
- TCP
- HTTP服务端
- WebSocket
- PHP7
- 生成器yield
- 异常finally
- CGI和FPM
- php有用命令
- 内存