0 ) { // Check for new connections if ( in_array( $server, $read ) ) { $client = stream_socket_accept( $server ); if ( $client ) { // Perform WebSocket handshake $request = fread( $client, 1024 ); preg_match( '#Sec-WebSocket-Key: (.*)\r\n#', $request, $matches ); $key = base64_encode( pack( 'H*', sha1( $matches[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' ) ) ); $handshakeResponse = "HTTP/1.1 101 Switching Protocols\r\n" . "Upgrade: websocket\r\n" . "Connection: Upgrade\r\n" . "Sec-WebSocket-Accept: $key\r\n\r\n"; fwrite( $client, $handshakeResponse ); $clients[] = $client; echo "New client connected!\n"; // Send welcome message to the client $site_name = get_bloginfo( 'name' ); $welcome_message = "Welcome to $site_name server"; $response = encodeWebSocketData( $welcome_message ); fwrite( $client, $response ); } unset( $read[array_search( $server, $read )] ); } // Handle existing client messages foreach ( $read as $client ) { $data = fread( $client, 1024 ); if ( !$data ) { fclose( $client ); unset( $clients[array_search( $client, $clients )] ); echo "Client disconnected.\n"; continue; } // Decode WebSocket message $decodedData = decodeWebSocketData( $data ); echo "Received: $decodedData\n"; // Echo back the message to the client $response = encodeWebSocketData( "Echo: $decodedData" ); fwrite( $client, $response ); } } } // Function to decode WebSocket frame function decodeWebSocketData( $data ) { $unmaskedPayload = ''; $decodedData = unpack( 'H*', $data ); $bytes = $decodedData[1]; $mask = [ hexdec( substr( $bytes, 4, 2 ) ), hexdec( substr( $bytes, 6, 2 ) ), hexdec( substr( $bytes, 8, 2 ) ), hexdec( substr( $bytes, 10, 2 ) ) ]; $data = substr( $bytes, 12 ); for ( $i = 0; $i < strlen( $data ); $i += 2 ) { $unmaskedPayload .= chr( $mask[( $i / 2 ) % 4] ^ hexdec( substr( $data, $i, 2 ) ) ); } return $unmaskedPayload; } // Function to encode WebSocket frame function encodeWebSocketData( $data ) { $frame = []; $frame[0] = 129; $length = strlen( $data ); if ( $length <= 125 ) { $frame[1] = $length; } else if ( $length >= 126 && $length <= 65535 ) { $frame[1] = 126; $frame[2] = ( $length >> 8 ) & 255; $frame[3] = $length & 255; } for ( $i = 0; $i < $length; $i++ ) { $frame[] = ord( $data[$i] ); } return call_user_func_array( 'pack', array_merge( ['C*'], $frame ) ); }