현재 위치: > 최신 기사 목록> 프론트 엔드 WebSocket 클라이언트와의 커뮤니케이션 : Socket_Accept의 구현 아이디어

프론트 엔드 WebSocket 클라이언트와의 커뮤니케이션 : Socket_Accept의 구현 아이디어

M66 2025-05-20

웹 응용 프로그램에서 WebSocket은 클라이언트와 서버간에 전체 이중 통신 채널을 설정하는 방법을 제공합니다. 기존의 HTTP 요청과 비교하여 WebSocket을 사용하면 서버가 클라이언트에게 메시지를 적극적으로 푸시 할 수 있습니다. PHP는 전통적인 의미에서 긴 연결에 가장 적합한 언어는 아니지만 기본 소켓 프로그래밍을 통해 간단한 WebSocket 서비스를 구현할 수 있습니다. 이 기사는 PHP의 Socket_accept 함수를 사용하여 프론트 엔드 WebSocket 클라이언트와의 커뮤니케이션을 달성하는 방법을 소개합니다.

전제 조건

PHP의 소켓 기능을 사용하려면 PHP에서 소켓 확장이 활성화되어 있는지 확인해야합니다. php.ini 에서 활성화 할 수 있습니다.

 extension=sockets

그런 다음 PHP 서비스를 다시 시작하십시오.

WebSocket 서버를 만듭니다

WebSocket의 핸드 셰이크 프로세스는 특정 프로토콜 사양을 따릅니다. WebSocket 데이터 프레임 통신을 수행하기 전에 클라이언트 요청을받은 후 HTTP 프로토콜 레벨 핸드 셰이크 확인을 수행해야합니다.

다음은 완전한 PHP 스크립트 예입니다.

 <?php
$host = '0.0.0.0';
$port = 8080;

$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, $host, $port);
socket_listen($serverSocket);

echo "WebSocket 서버가 시작됩니다 $host:$port\n";

while (true) {
    $clientSocket = socket_accept($serverSocket);
    if ($clientSocket === false) {
        continue;
    }

    // 클라이언트 요청 헤더를 읽습니다
    $request = socket_read($clientSocket, 1024);
    if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $request, $matches)) {
        $key = trim($matches[1]);
        $acceptKey = base64_encode(pack('H*', sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
        $headers = "HTTP/1.1 101 Switching Protocols\r\n";
        $headers .= "Upgrade: websocket\r\n";
        $headers .= "Connection: Upgrade\r\n";
        $headers .= "Sec-WebSocket-Accept: $acceptKey\r\n\r\n";
        socket_write($clientSocket, $headers);
        echo "WebSocket 핸드 셰이크가 완료되었습니다。\n";
    }

    // 간단한 읽기 및 보내기 WebSocket 정보
    while (true) {
        $data = socket_read($clientSocket, 2048);
        if ($data === false) {
            break;
        }

        $decoded = unmask($data);
        echo "接收到客户端정보: $decoded\n";

        $response = mask("당신이 보낸 것은입니다: $decoded");
        socket_write($clientSocket, $response);
    }

    socket_close($clientSocket);
}

socket_close($serverSocket);

// 분석 WebSocket 액자
function unmask($payload) {
    $length = ord($payload[1]) & 127;
    if ($length == 126) {
        $masks = substr($payload, 4, 4);
        $data = substr($payload, 8);
    } elseif ($length == 127) {
        $masks = substr($payload, 10, 4);
        $data = substr($payload, 14);
    } else {
        $masks = substr($payload, 2, 4);
        $data = substr($payload, 6);
    }

    $text = '';
    for ($i = 0; $i < strlen($data); ++$i) {
        $text .= $data[$i] ^ $masks[$i % 4];
    }
    return $text;
}

// 구조 WebSocket 数据액자
function mask($text) {
    $b1 = 0x81; // FIN=1, opcode=0x1 (text)
    $length = strlen($text);

    if ($length <= 125) {
        $header = pack('CC', $b1, $length);
    } elseif ($length <= 65535) {
        $header = pack('CCn', $b1, 126, $length);
    } else {
        $header = pack('CCNN', $b1, 127, 0, $length);
    }

    return $header . $text;
}
?>

프론트 엔드 클라이언트 예

프론트 엔드에서는 다음과 같은 방법으로 PHP WebSocket 서비스와 통신 할 수 있습니다.

 <script>
    const socket = new WebSocket("ws://m66.net:8080");

    socket.onopen = () => {
        console.log("연결이 설정되었습니다");
        socket.send("안녕하세요 PHP WebSocket!");
    };

    socket.onmessage = (event) => {
        console.log("收到정보:", event.data);
    };

    socket.onclose = () => {
        console.log("연결이 닫힙니다");
    };
</script>

참고 : WS : //m66.net : 8080 여기 서버 주소입니다. 배포 환경에 따라 도메인 이름과 포트 매핑을 설정하십시오.

요약

PHP의 Socket_accept 및 관련 기능을 사용하면 기본 WebSocket 서버 로직을 구현할 수 있습니다. 이 방법은 학습 및 실험 목적에 적합합니다. 생산 환경의 경우 Ratchet, Swoole과 같은 고급 성능 솔루션을 사용하거나 전용 WebSocket 서버 (예 : Node.js, GO)를 사용하는 것이 좋습니다.

PHP는 긴 연결을 위해 설계되지 않았지만 기본 소켓은 강력하며 기본적인 양방향 통신 요구를 충족시킬 수 있습니다. 이 기사의 예제를 통해 프론트 엔드 클라이언트와 상호 작용하기 위해 간단한 PHP WebSocket 서버를 구축 할 수 있습니다.