想写一下websocket,但是无论如何收不到捂手信息,找了好久,有人给瞅瞅吗,chrome一直显示pending,代码如下:
$address = '0.0.0.0';
$port = '8081';
$sockets = [];
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, $address, $port);
socket_listen($server, 10);
array_push($sockets, $server);
while (true) {
$write = null;
$except = null;
socket_select($sockets, $write, $except, null);
foreach ($sockets as $socket) {
if ($socket == $server) {
//等待接受一个链接
$client = socket_accept($socket);
//获取接数据
$buff = socket_read($client, 1024);
//得到请求头中升级ws协议的key
preg_match('/Sec\-WebSocket\-Key:\s(.*)/', $buff, $result);
$wsKey = $result;
//编码key 编码方式: 请求头Sec-WebSocket-Key的值 + 固定字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11" sha1进行hash后base64编码
$acceptWsKey = base64_encode(pack('H*', sha1($wsKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
//组合响应头
$responseHttpHeader = 'HTTP/1.1 101 Switching Protocols\r\n';
$responseHttpHeader .= 'Upgrade: websocket\r\n';
$responseHttpHeader .= 'Connection: Upgrade\r\n';
$responseHttpHeader .= 'Sec-WebSocket-Accept: ' . $acceptWsKey . '\r\n\r\n';
socket_write($client, $responseHttpHeader, strlen($responseHttpHeader));
array_push($sockets, $client);
}
}
}
最近正在学习socket 如果问的有点低级 大佬别喷...
多谢回复,找到问题了 上面没有握手成功的原因是返回http头的时候用的单引号, 而我系统是linux,导致没有被解析成换行,所以用PHP_EOL代替\r\n或者双引号代替单引号都可以解决
@5282: 不客气,是的,我在你代码基础上调试时有发现了单引号的问题。