正文

PHP实现web socket长链接流程详解(php做购物车)燃爆了

文章摘要

该代码用于实现一个WebSocket服务器,通过`stream_socket_server`函数创建一个TCP连接服务器。代码的主要功能如下: 1. 使用`stream_socket_accept`循环接收客户端连接,并处理每条连接: - 读取客户端发送的数据包(`fread`) - 发送回数据包(`send`函数) - 在每次连接后打印握手信息(`fputput`) 2. `send`函数的作用: - 提取客户端发送的`Sec-WebSocket-Key` - 生成新的WebSocket密钥(使用`base64_encode`和`sha1`) - 构造握手消息,模拟身份验证过程 - 打印并发送握手信息 代码整体目的是通过生成握手消息来验证客户端身份,并建立完整的WebSocket连接。

$socket=stream_socket_server(‘tcp://’.$ipServer.’:’.$portNumber, $errno, $errstr); while($conn=@stream_socket_accept($socket,$nbSecondsIdle)) { $message=fread($conn, 1024); send($conn,$message); //@todo //连接成功,有要保持连接,用来接收客户端发送过来的数据包 这里可以把这个连接$conn 保存在内存当中,通过Select or Swoole 事件去loop fputs ($conn, “OK\n”); } function send($socket,$buffer){ $Sec_WebSocket_Key=”; if (\preg_match(“/Sec-WebSocket-Key: *(.*?)\r\n/i”, $buffer, $match)) { $Sec_WebSocket_Key=$match[1]; } $new_key=\base64_encode(\sha1($Sec_WebSocket_Key . “258EAFA5-E914-47DA-95CA-C5AB0DC85B11″, true)); $handshake_message=”HTTP/1.1 101 Switching Protocols\r\n” .”Upgrade: websocket\r\n” .”Sec-WebSocket-Version: 13\r\n” .”Connection: Upgrade\r\n” .”Sec-WebSocket-Accept: ” . $new_key . “\r\n”; $handshake_message .=”\r\n”; var_dump($handshake_message);//打印握手信息,然后发送给客户端,建立完整连接 //socket_write($socket,$handshake_message); $len=@\fwrite($socket, $handshake_message); return 0; }