PHP에서 소켓 프로그래밍은 네트워크 통신을 실현하는 기본 수단 중 하나입니다. 기본적으로 소켓은 차단하지 않을 수 있습니다. 즉, 데이터가 없으면 데이터가 도착하기를 기다리는 대신 읽기 작업이 즉시 반환됩니다. 차단 소켓은 데이터를 읽을 때까지 데이터를 읽는 동안 프로그램을 대기하게하여 간단한 동기 채팅 프로그램을 구현하는 데 적합합니다.
이 기사는 PHP의 Socket_set_Block 함수를 사용하여 소켓을 차단 모드로 설정하고이를 기반으로 간단한 차단 채팅 프로그램 예제를 구현하는 방법을 소개합니다.
차단 소켓은 읽기 또는 쓰기 작업을 수행 할 때 데이터가 도착하거나 작동 할 때까지 대기하는 프로그램이 일시 중지되고 대기합니다. 이 방법은 논리를 구현하고 명확하게하는 것이 간단하므로 초보자 및 소규모 채팅 응용 프로그램에 이상적입니다.
대조적으로, 비 블로킹 소켓에는 논리적으로 복잡하지만 고성능 요구 사항에 더 적합한 이벤트 폴링 또는 비동기 작업이 필요합니다.
socket_set_block은 소켓 차단 모드를 설정하는 PHP의 함수입니다. 이 기능을 호출 한 후 소켓은 차단 상태로 전환됩니다.
기능 프로토 타입 :
bool socket_set_block(resource $socket)
$ 소켓 : 설정 해야하는 소켓 리소스
반환 값 : 성공을 위해 True , 실패에 대해 False를 반환합니다.
아래는 간단한 차단 소켓 채팅 서버의 예입니다. 클라이언트는 연결 후 메시지를 보낼 수 있으며 서버는 메시지를 수신 한 후에 단순히 에코입니다.
<?php
$host = "0.0.0.0";
$port = 12345;
// 만들다 Socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($sock === false) {
die("socket_create() 실패하다: " . socket_strerror(socket_last_error()));
}
// 주소와 포트 바인드
if (!socket_bind($sock, $host, $port)) {
die("socket_bind() 실패하다: " . socket_strerror(socket_last_error($sock)));
}
// 포트를 들어보세요
if (!socket_listen($sock, 5)) {
die("socket_listen() 실패하다: " . socket_strerror(socket_last_error($sock)));
}
echo "서버 시작,감시 장치 {$host}:{$port}...\n";
// 클라이언트 연결을 수락합니다
$client = socket_accept($sock);
if ($client === false) {
die("socket_accept() 실패하다: " . socket_strerror(socket_last_error($sock)));
}
// 클라이언트 설정 Socket 차단 모드에서
socket_set_block($client);
echo "클라이언트 연결이 성공적입니다,메시지를 기다리고 있습니다...\n";
while (true) {
// 클라이언트 데이터의 읽기 차단
$data = socket_read($client, 2048, PHP_NORMAL_READ);
if ($data === false) {
echo "socket_read() 실패하다: " . socket_strerror(socket_last_error($client)) . "\n";
break;
}
$data = trim($data);
if ($data === '') {
continue;
}
echo "클라이언트 메시지를 받았습니다: $data\n";
if ($data === 'quit') {
echo "클라이언트 단절\n";
break;
}
// 클라이언트에게 메시지를 반영합니다
$response = "서버가 접수되었습니다: $data\n";
socket_write($client, $response, strlen($response));
}
// 폐쇄 Socket 연결하다
socket_close($client);
socket_close($sock);
?>
위의 코드를 Server.php 로 저장하고 명령 줄에서 실행하십시오.
php server.php
Telnet 또는 기타 TCP 클라이언트를 사용하여 연결하십시오.
telnet gitbox.net 12345
(이 예에서 포트는 12345이고 도메인 이름 예제는 gitbox.net 으로 변경됩니다)
메시지를 입력하면 서버가 차단하고 입력을 대기하고 메시지를 수신 한 후 확인하기 위해 돌아갑니다.
연결을 끊으려면 종료를 입력하십시오.
socket_set_block을 사용하면 소켓을 차단 모드로 설정하는 것이 매우 편리하여 간단한 동기 채팅 로직이 가능합니다. 블로킹 프로그래밍은 초보자가 네트워크 프로그래밍을 신속하게 시작하는 데 적합하지만 동시성 시나리오에서는 비 블로킹 또는 비동기 방법이 더 효율적입니다.
PHP 소켓 프로그래밍에 대한 자세한 내용은 다음을 방문하십시오.
https://gitbox.net/manual/socket