현재 위치: > 최신 기사 목록> [Socket_export_stream을 통해 클라이언트와 서버간에 양방향 통신 메커니즘을 구현하는 방법은 무엇입니까?

[Socket_export_stream을 통해 클라이언트와 서버간에 양방향 통신 메커니즘을 구현하는 방법은 무엇입니까?

M66 2025-06-22

PHP 네트워크 프로그래밍에서 Socket_* 시리즈 기능은 개발자에게 기본 네트워크 통신 기능을 제공합니다. Stream_Socket_* 시리즈 기능이 더 발전하고 사용하기 쉽지만 Socket_*는 기본 제어 요구 사항이 더 높은 일부 시나리오에서는 대체 할 수없는 장점이 여전히 있습니다. 이 기사에서는 기본 소켓을 Socket_export_stream을 통해 스트림으로 변환하는 방법을 소개하여 클라이언트와 서버 간의 양방향 통신 메커니즘을 실현합니다.

socket_export_stream이란 무엇입니까?

Socket_export_stream 은 PHP가 기본 소켓 리소스를 스트림 리소스로 내보내기 위해 제공되는 기능이므로 Fread ()fwrite () 와 같은 친숙한 파일 흐름 기능을 사용하여 소켓 데이터를 조작 할 수 있습니다. 이 접근법은 기본 소켓의 유연성을 스트림 API의 사용 편의성과 결합합니다.

 stream socket_export_stream(Socket $socket): resource|false

fopen , stream_select , fgets 등과 같은 함수와 함께 작동하는 데 사용할 수있는 유형 스트림 의 리소스를 반환합니다.


1. 서버 소켓을 만듭니다

서버는 socket_create () 를 통해 TCP 소켓을 생성하고 로컬 주소 및 포트에 바인딩합니다.

 $serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, '0.0.0.0', 9501);
socket_listen($serverSocket);
echo "서버가 시작되었습니다,포트를 들어보세요 9501...\n";

2. 연결을 수락하고 스트림으로 내 보냅니다

서버는 클라이언트 연결 요청을 차단하고 기다립니다. 연결 리소스를 읽을 수 있고 쓰기 쉬운 스트림으로 내 보냅니다.

 while (true) {
    $clientSocket = socket_accept($serverSocket);
    if ($clientSocket === false) {
        echo "연결을 수락하지 못했습니다\n";
        continue;
    }

    $clientStream = socket_export_stream($clientSocket);
    if ($clientStream === false) {
        echo "내보내다 stream 실패하다\n";
        socket_close($clientSocket);
        continue;
    }

    fwrite($clientStream, "오신 것을 환영합니다 m66.net 섬기는 사람\n");
    
    while (!feof($clientStream)) {
        $data = fgets($clientStream);
        if ($data === false) break;
        echo "고객이 말합니다: $data";
        fwrite($clientStream, "당신이 말한 것은:$data");
    }

    fclose($clientStream);
    socket_close($clientSocket);
}

3. 서버에 대한 클라이언트 연결

클라이언트는 Socket_create를 사용하여 서버에 연결 한 다음 Socket_export_stream을 사용하여 데이터를 읽고 쓰십시오.

 $client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($client, 'm66.net', 9501);

$stream = socket_export_stream($client);
if ($stream === false) {
    echo "내보내다 stream 실패하다\n";
    exit(1);
}

echo fgets($stream); // 환영 메시지를받습니다

fwrite($stream, "안녕하세요,섬기는 사람!\n");
echo fgets($stream); // Echo를 읽으십시오

fclose($stream);
socket_close($client);

장점과 예방 조치

장점

  • 코드는 간결합니다 . 스트림 인터페이스는 소켓 데이터의 읽기 및 쓰기 프로세스를 단순화합니다.

  • 높은 호환성 : Stream_Select , Stream_Set_Blocking 등과 같은 함수와 함께 사용할 수 있습니다.;

  • 양방향 통신은 자연스럽고 매끄 럽습니다 . 루프 읽기 및 쓰기를 통해 실시간 응답을 달성 할 수 있습니다.

주목해야 할 것

  • socket_export_stream은 연결된 소켓에만 사용할 수 있습니다.

  • 사용 후 리소스 누출을 방지하기 위해 스트림과 소켓을 닫아야합니다.

  • 네트워크 통신은 차단 또는 충돌을 피하기 위해 예외 처리 및 시간 초과 제어를 고려해야합니다.