PHP 네트워크 프로그래밍에서 Socket_* 시리즈 기능은 개발자에게 기본 네트워크 통신 기능을 제공합니다. Stream_Socket_* 시리즈 기능이 더 발전하고 사용하기 쉽지만 Socket_*는 기본 제어 요구 사항이 더 높은 일부 시나리오에서는 대체 할 수없는 장점이 여전히 있습니다. 이 기사에서는 기본 소켓을 Socket_export_stream을 통해 스트림으로 변환하는 방법을 소개하여 클라이언트와 서버 간의 양방향 통신 메커니즘을 실현합니다.
Socket_export_stream 은 PHP가 기본 소켓 리소스를 스트림 리소스로 내보내기 위해 제공되는 기능이므로 Fread () 및 fwrite () 와 같은 친숙한 파일 흐름 기능을 사용하여 소켓 데이터를 조작 할 수 있습니다. 이 접근법은 기본 소켓의 유연성을 스트림 API의 사용 편의성과 결합합니다.
stream socket_export_stream(Socket $socket): resource|false
fopen , stream_select , fgets 등과 같은 함수와 함께 작동하는 데 사용할 수있는 유형 스트림 의 리소스를 반환합니다.
서버는 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";
서버는 클라이언트 연결 요청을 차단하고 기다립니다. 연결 리소스를 읽을 수 있고 쓰기 쉬운 스트림으로 내 보냅니다.
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);
}
클라이언트는 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은 연결된 소켓에만 사용할 수 있습니다.
사용 후 리소스 누출을 방지하기 위해 스트림과 소켓을 닫아야합니다.
네트워크 통신은 차단 또는 충돌을 피하기 위해 예외 처리 및 시간 초과 제어를 고려해야합니다.