현재 위치: > 최신 기사 목록> socket_export_stream 및 fread 함수는 어떻게 데이터를 함께 읽습니까? 실제 사례에 대한 자세한 설명

socket_export_stream 및 fread 함수는 어떻게 데이터를 함께 읽습니까? 실제 사례에 대한 자세한 설명

gitbox 2025-08-30

1. socket_export_stream 함수를 이해하십시오

Socket_export_stream 함수의 기능은 원시 소켓 리소스를 표준 PHP 스트림 기능과 호환되는 스트림 리소스로 변환하는 것입니다. 기본 소켓 연결이 Fread 와 같은 스트림 읽기 기능으로 작동 할 수 있으므로 데이터 읽기가보다 편리합니다.

 <span><span>resource </span><span><span class="hljs-title function_ invoke__">socket_export_stream</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> )
</span></span>

반환 값은 표준 스트림 리소스이므로 Fread , Fwrite 또는 기타 스트림 작동 기능을 사용하여 데이터를 읽거나 쓰는 것입니다.

2. 프레드 기능을 이해하십시오

Fread는 파일 포인터 또는 스트림에서 지정된 수의 바이트 데이터를 읽는 데 사용되는 기능입니다. 스트림에서 데이터를 읽기 위해 fopen , socket_export_stream 등과 함께 사용됩니다.

 <span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-title function_ invoke__">fread</span></span><span> ( resource </span><span><span class="hljs-variable">$handle</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$length</span></span><span> )
</span></span>

매개 변수 :

  • $ 핸들 은 스트림 리소스로, socket_export_stream에 의해 리턴 된 스트림 리소스 일 수 있습니다.

  • $ 길이는 읽을 바이트 수입니다.

Fread는 읽기 내용을 반환하고 데이터를 읽을 수없는 경우 빈 문자열을 반환합니다.

3. 실제 예 : 클라이언트와 서버 간의 데이터 읽기

서버와 통신하는 TCP 클라이언트의 간단한 인스턴스를 생성합니다. 클라이언트는 서버에 연결하고 소켓을 통해 요청을 보내며 Fread를 사용하여 서버의 응답을 읽습니다.

3.1 서버 측 코드 작성

 <span><span><span class="hljs-comment">// 서버 측 코드</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;

</span><span><span class="hljs-comment">// 만들다 socket 의지</span></span><span>
</span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>, </span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"서버가 시작되었습니다,클라이언트 연결을 기다리고 있습니다...\n"</span></span><span>;

</span><span><span class="hljs-comment">// 클라이언트 연결을 기다리고 있습니다</span></span><span>
</span><span><span class="hljs-variable">$client</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);

</span><span><span class="hljs-comment">// 클라이언트에게 데이터를 보냅니다</span></span><span>
</span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"Hello from server!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_write</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>, </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$message</span></span><span>));

</span><span><span class="hljs-comment">// 연결을 닫으십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span></span>

3.2 클라이언트 코드 작성

 <span><span><span class="hljs-comment">// 클라이언트 코드</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;

</span><span><span class="hljs-comment">// 만들다 socket 의지</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);

</span><span><span class="hljs-comment">// 할 것이다 socket 의지转换为流의지</span></span><span>
</span><span><span class="hljs-variable">$stream</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_export_stream</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);

</span><span><span class="hljs-comment">// 스트림에서 데이터를 읽습니다</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);  </span><span><span class="hljs-comment">// 가장 많이 읽으십시오 1024 바이트 데이터</span></span><span>

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"서버 응답: "</span></span><span> . </span><span><span class="hljs-variable">$response</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;

</span><span><span class="hljs-comment">// 연결을 닫으십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

4. 코드 파싱

  • 서버 측 : 먼저, 우리는 TCP 소켓을 만들고 로컬 주소와 포트 8080에 묶여 있습니다. 서버는 클라이언트가 연결되기를 기다리는 동안 들립니다. 클라이언트 연결이 있으면 연결을 수락하고 메시지를 보내고 연결을 닫습니다.

  • 클라이언트 : 클라이언트는 먼저 TCP 소켓을 생성하고 서버에 연결합니다. 그런 다음 socket_export_stream을 사용하여 소켓을 스트림 리소스로 변환하십시오. 다음으로 프레드 기능을 통해 서버에서 반환 된 데이터를 읽습니다.

5. 자주 묻는 질문과 예방 조치

5.1 데이터는 완전히 읽지 않습니다

네트워크 프로그래밍에서 데이터를 읽을 때 종종 발생하는 문제는 불완전한 데이터를 읽습니다. 예를 들어, 서버에서 전송하는 데이터의 양은 한 번에 읽은 바이트 수보다 훨씬 클 수 있습니다. 현재 모든 데이터를 읽을 때까지 일부 데이터 스 플라이 싱 작업을 수행해야합니다.

 <span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>)) {
    </span><span><span class="hljs-variable">$chunk</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);  </span><span><span class="hljs-comment">// 각각 읽습니다 1024 바이트</span></span><span>
    </span><span><span class="hljs-variable">$response</span></span><span> .= </span><span><span class="hljs-variable">$chunk</span></span><span>;
}
</span></span>

5.2 비 블로킹 모드

PHP 소켓은 기본적으로 차단됩니다. 즉, Fread는 데이터가 돌아 오기 전에 데이터가 도착할 때까지 기다릴 수 있습니다. 비 블로킹 데이터를 읽어야하는 경우 Socket_set_NonBlock을 사용하여 소켓을 비 블로킹 모드로 설정할 수 있으므로 데이터가 완전히 읽지 않더라도 Fread는 즉시 반환됩니다.

 <span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

6. 요약

socket_export_streamfread 함수를 통해 소켓 데이터 스트림을보다 쉽게 ​​작동 할 수 있습니다. 이 두 기능은 파일 스트림 조작과 같은 원격 서버의 네트워크 데이터를 간단히 읽을 수 있도록 조합으로 사용될 수 있습니다. 실제 개발 에서이 접근법은 실시간 및 지속적인 데이터 상호 작용을 처리하는 데 매우 적합합니다.

이 기사의 예제를 통해 소켓에서 얻은 실제 개발 및 프로세스 데이터를 위해이 두 기능을 결합하는 방법을 더 잘 이해할 수 있기를 바랍니다.