ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 概述 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); } ~~~ 完成此步骤,浏览器和服务器之间的握手操作就完成,后就可以进行相互的通信操作。