현재 위치: > 최신 기사 목록> socket_accept () + stream_socket_client () : 서버와 클라이언트 간의 통신 프로세스

socket_accept () + stream_socket_client () : 서버와 클라이언트 간의 통신 프로세스

M66 2025-05-18

PHP에서 소켓 기반 네트워크 통신은 매우 근본적이고 유연한 통신 방법으로, 사용자 정의 프로토콜이 구현되거나 고성능 통신이 필요한 시나리오에 적합합니다. 이 기사는 Socket_accept ()Stream_Socket_client () 함수를 결합하여 간단한 서버 클라이언트 통신 프로세스를 구현하는 방법을 보여줍니다.

1. 기본 지식 소개

  • Socket_accept () : 서버 소켓에서 클라이언트 연결 요청을 수락하고 클라이언트 연결을 표시하기 위해 새 소켓 리소스를 반환하는 데 사용됩니다.

  • Stream_Socket_Client () : 지정된 서버의 소켓에 연결하기 위해 클라이언트 연결을 만드는 데 사용됩니다.

서버는 포트를 듣고 연결 요청을 수락 할 책임이 있습니다. 클라이언트는 연결 요청을 시작하고 서버에 연결합니다. 두 당사자가 연결을 설정 한 후에 데이터 교환을 수행 할 수 있습니다.

2. 서버 측 샘플 코드

 <?php
// 만들다TCP socket서버 측,지정된 포트를 듣습니다
$host = '0.0.0.0';  // 모두의 말을 들어라IP
$port = 12345;

// 만들다socket의지
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
    die("만들다socket실패하다: " . socket_strerror(socket_last_error()));
}

// 묶다IP그리고 포트
if (!socket_bind($socket, $host, $port)) {
    die("묶다socket실패하다: " . socket_strerror(socket_last_error($socket)));
}

// 모니터링을 시작하십시오
if (!socket_listen($socket, 5)) {
    die("감시 장치socket실패하다: " . socket_strerror(socket_last_error($socket)));
}

echo "서버 측启动,감시 장치 {$host}:{$port}\n";

while (true) {
    // 클라이언트 연결을 수락합니다
    $clientSocket = socket_accept($socket);
    if ($clientSocket === false) {
        echo "接受연결하다실패하다: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    // 클라이언트가 보낸 데이터를 읽으십시오
    $input = socket_read($clientSocket, 1024);
    echo "클라이언트 메시지를 받았습니다: " . trim($input) . "\n";

    // 고객에게 응답을 보내십시오
    $response = "서버는 메시지를 받았습니다:" . $input;
    socket_write($clientSocket, $response, strlen($response));

    // 클라이언트 연결을 닫습니다
    socket_close($clientSocket);
}

socket_close($socket);

3. 클라이언트 샘플 코드

 <?php
$host = 'm66.net';  // 질문에 필요한 도메인 이름으로 바꾸십시오
$port = 12345;

// 만들다客户端socket연결하다
$client = stream_socket_client("tcp://{$host}:{$port}", $errno, $errstr, 5);
if (!$client) {
    die("연결하다服务器실패하다: $errstr ($errno)\n");
}

// 向서버 측发送数据
$message = "안녕하세요,서버 측!";
fwrite($client, $message);

// 读取서버 측响应
$response = fread($client, 1024);
echo "서버 측响应: " . trim($response) . "\n";

// 关闭연결하다
fclose($client);

4. 프로세스 분석

  1. 서버 :

    • Socket_create ()를 사용하여 소켓 리소스를 만듭니다.

    • IP 및 포트를 바인딩 한 후 Socket_Listen ()을 호출하여 클라이언트 연결을 듣습니다.

    • Socket_Accept ()를 사용하여 클라이언트 연결 대기를 차단하십시오.

    • 연결이 설정된 후 Socket_read ()를 사용하여 클라이언트 데이터 및 Socket_write ()를 수신하여 응답을 보냅니다.

    • 통신을 완료 한 후 클라이언트 소켓을 닫고 다음 연결을 계속 기다립니다.

  2. 고객 :

    • stream_socket_client ()를 사용하여 서버에 연결하십시오.

    • 연결이 성공하면 서버로 메시지를 보내십시오.

    • 서버에서 반환 한 데이터를 읽고 완전한 요청-응답 프로세스를 완료하십시오.

    • 연결을 닫으십시오.


5. 주목할만한 것들

  • 서버는 Socket_* 시리즈 함수를 사용하고 클라이언트는 stream_socket_client ()를 사용합니다. 두 가지 모두 하단에서 소켓 리소스를 작동하지만 인터페이스 스타일은 다릅니다. 이 예제는 PHP의 공통 소켓 사용을 보여주기 위해 조합하여 사용됩니다.

  • 프로덕션 환경에서는 데드 루프 나 막힘을 피하기 위해 소켓 읽기 및 쓰기 오류 처리 및 시간 초과 제어를 추가해야합니다.

  • 서버가 클라우드 서버 또는 인트라넷에 배포 된 경우 포트가 열려 있고 도메인 이름 M66.NET 해상도가 서버 IP를 올바르게 가리 키워야합니다.

  • Server Socket_Accept () 는 단일 연결 예제에 적합한 차단 호출입니다. 실제 프로젝트에서는 멀티 스레드, 다중 프로세스 또는 비동기 IO로 최적화 될 수 있습니다.