websocket学习
简单的例子
Websocket握手
客户端发送:
GET / HTTP/1.1
Host: 192.168.1.213:8999
Connection: Upgrade
Upgrade: websocket
Origin: http://localhost
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: xmcdcwN39t4dE4YsqCkqzA==
服务器端相应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Sec-WebSocket-Version: 13
Connection: Upgrade
Sec-WebSocket-Accept: XjYWBVMYrP+XK8AlZ8CVRuaWBy4=
-
Connection 必须设置 Upgrade,表示客户端希望连接升级。
-
Upgrade 字段必须设置 Websocket,表示希望升级到 Websocket 协议。
-
Sec-WebSocket-Key 是随机的字符串。
-
Sec-WebSocket-Accept 服务器端拿到客户端Sec-WebSocket-Key传过来的随机字符串,然后拼接"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",进行sha1计算后,在进行base64编码,返回给客户端:
base64_encode(sha1(Sec-WebSocket-Key的值 . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true))
客户端
创建 WebSocket 对象
var ws = new WebSocket("ws://192.168.1.213:8999");
监听服务器返回的数据
ws.onmessage = function (e) {
// ---
}
往服务器端发送数据
ws.send(JSON.stringify(data));
关闭连接
ws.onclose = function() {
// 关闭 websocket
};
服务器端
<?php
$host = '0.0.0.0';
$port = 9999;
// 创建一个socket套接字
$listen_socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
// 将socket bind到IP:port上
socket_bind( $listen_socket, $host, $port );
// 开始监听socket
socket_listen( $listen_socket );
// 进入while循环,不用担心死循环死机,因为程序将会阻塞在下面的socket_accept()函数上
while( true ){
// 此处将会阻塞住,一直到有客户端来连接服务器。阻塞状态的进程是不会占据CPU的
// 所以你不用担心while循环会将机器拖垮,不会的
$connection_socket = socket_accept( $listen_socket );
// 向客户端发送一个helloworld
$msg = "helloworld\r\n";
socket_write( $connection_socket, $msg, strlen( $msg ) );
socket_close( $connection_socket );
}
//关闭连接
socket_close( $listen_socket );