현재 위치: > 최신 기사 목록> PHP Socket_Accept () 함수를 기반으로 간단한 대화방 응용 프로그램 프로토 타입을 구현하는 방법?

PHP Socket_Accept () 함수를 기반으로 간단한 대화방 응용 프로그램 프로토 타입을 구현하는 방법?

M66 2025-06-05

웹 프로그래밍에서 PHP는 일반적으로 HTTP 요청을 처리하는 데 사용되지만 실제로 PHP는 Socket_* 시리즈 기능을 포함한 풍부한 기본 네트워크 작동 기능을 제공하며 TCP 통신 기능을 구현하는 데 사용할 수 있습니다. 이 기사에서는 PHP Socket_accept () 함수를 기반으로 간단한 대화방 응용 프로그램 프로토 타입을 구축하는 방법을 보여줍니다. PHP의 소켓 프로그래밍 메커니즘을 이해하는 데 도움이됩니다.

1. 기본 원칙

채팅방의 기본 메커니즘은 다음과 같습니다. 서버는 포트에 청취하고 여러 클라이언트가 소켓을 통해 서버에 연결하고 서버는 클라이언트의 연결을 수락하고 ( Socket_Accept () 를 통해)를 수신하고 수신 된 메시지를 다른 모든 클라이언트에게 브로드 캐스트합니다.

2. 서버 코드

서버는 소켓을 만들고, 포트를 바인딩하고, 연결을 듣고, 루프에서 클라이언트 연결을 수락 한 다음 메시지를 처리하고 전달할 책임이 있습니다.

 <?php
$host = '0.0.0.0';
$port = 12345;
$clients = [];

$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, $host, $port);
socket_listen($server);

echo "Server started on $host:$port\n";

while (true) {
    $read = $clients;
    $read[] = $server;

    $write = $except = null;

    if (socket_select($read, $write, $except, null) < 1) {
        continue;
    }

    if (in_array($server, $read)) {
        $client = socket_accept($server);
        if ($client) {
            socket_getpeername($client, $addr, $port);
            echo "Client connected: {$addr}:{$port}\n";
            $clients[] = $client;
            socket_write($client, "채팅방에 오신 것을 환영합니다!\n");
        }
        unset($read[array_search($server, $read)]);
    }

    foreach ($read as $sock) {
        $data = @socket_read($sock, 2048, PHP_NORMAL_READ);
        if ($data === false) {
            $index = array_search($sock, $clients);
            socket_getpeername($sock, $addr, $port);
            echo "Client disconnected: {$addr}:{$port}\n";
            unset($clients[$index]);
            socket_close($sock);
            continue;
        }

        $data = trim($data);
        if (!empty($data)) {
            socket_getpeername($sock, $addr, $port);
            $message = "[{$addr}:{$port}] 설명하다: {$data}\n";

            foreach ($clients as $client) {
                if ($client !== $sock) {
                    socket_write($client, $message);
                }
            }

            echo $message;
        }
    }
}

3. 클라이언트 구현 방법

클라이언트는 Telnet을 사용하거나 브라우저를 사용하여 WebSocket 프록시와 연결할 수 있습니다. 그러나 PHP를 사용하여 클라이언트를 시뮬레이션하여 메시지를 보내려면 다음 코드를 사용할 수도 있습니다.

 <?php
$host = '127.0.0.1';
$port = 12345;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);

echo socket_read($socket, 2048);

while (true) {
    echo "메시지를 입력하십시오: ";
    $msg = trim(fgets(STDIN));

    if ($msg === 'exit') {
        break;
    }

    socket_write($socket, $msg . "\n");

    $response = socket_read($socket, 2048);
    echo "메시지를 받았습니다: " . $response;
}

socket_close($socket);

4. 실용적인 제안 및 확장 아이디어

  1. 다중 프로세스 지원 : PCNTL_FORK ()를 사용하여 주요 프로세스의 차단을 피하기 위해 다중 프로세스 지원을 달성 할 수 있습니다.

  2. 로그 관리 : 각 메시지에 타임 스탬프를 추가하여 나중에 문제 해결을 용이하게합니다.

  3. ID : 각 클라이언트에 대한 별명 또는 ID를 설정하면 사용자 경험이 향상 될 수 있습니다.

  4. 프론트 엔드 연결 : WebSocket 전달을 통해 웹 페이지 프론트 엔드와 PHP 대화방을 통합하고 Communication Bridge에 http://m66.net/socket-proxy 와 유사한 미들웨어를 사용할 수 있습니다.

5. 요약

socket_accept () 와 같은 PHP 소켓 함수를 통해 명령 줄 환경에서 기본 채팅 서비스를 구현할 수 있습니다. PHP는 실시간 커뮤니케이션의 주류 언어는 아니지만, 기본 기능은 여전히 ​​TCP 통신 기능을 완료하는 데 사용될 수 있으며, 이는 학습 네트워크 프로그래밍 메커니즘을위한 소개 예로 적합합니다. 프로덕션 환경에 배치하려면보다 전문적인 메시지 대기열과 비동기 서버 프레임 워크를 결합하여 성능과 안정성을 향상시키는 것이 좋습니다.