고성능 및 유연한 네트워크 서비스를 구축 할 때 PHP는 웹 애플리케이션 구축에만 국한되지 않으며 기본 네트워크 통신을 처리 할 수 있습니다. PHP의 소켓 확장을 통해 사용자 정의 프로토콜을 기반으로 서버 측 프로그램을 만들 수 있습니다. 이 기사는 기본 원칙과 완전한 예를 포함하여 Socket_accept ()를 사용하여 사용자 정의 프로토콜 서버를 구현하는 방법에 대한 심층적 인 소개를 제공합니다.
Socket_accept () 는 PHP 소켓 확장에서 클라이언트의 연결 요청을 허용하는 기능입니다. 서버가 socket_create () 및 socket_bind () 를 통해 청취를 설정하면 socket_listen ()을 사용하여 연결을 듣기 시작하며 Socket_accept ()는 이러한 연결을 수신 할 책임이 있습니다. 클라이언트 연결이 있으면 클라이언트와 통신하기위한 새 소켓을 반환합니다.
요컨대, 그 과정은 다음과 같습니다.
소켓 생성;
주소와 포트를 바인딩합니다.
연결을 듣습니다.
연결 ( socket_accept () );
고객과의 커뮤니케이션;
연결을 닫으십시오.
JSON 형식의 요청을 수신하고 고정 형식으로 응답을 반환하는 것과 같은 사용자 정의 프로토콜 서버를 작성하고 싶다고 가정 해 봅시다. 이 서버는 HTTP 또는 기타 기존 프로토콜에 의존하지 않지만 TCP 계층에서 직접 통신합니다.
다음은 로컬 포트 9000을 듣고 클라이언트가 보낸 JSON 요청을 수신하고 처리 결과를 반환하는 사용자 정의 프로토콜 서버를 구현하는 방법을 보여주는 완전한 PHP 스크립트입니다.
<?php
set_time_limit(0); // 스크립트 시간 초과 방지
$host = '0.0.0.0';
$port = 9000;
// 1. 만들다 socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die("socket_create() 실패하다: " . socket_strerror(socket_last_error()) . "\n");
}
// 2. 주소와 포트 바인드
if (!socket_bind($socket, $host, $port)) {
die("socket_bind() 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// 3. 연결을 듣기 시작하십시오
if (!socket_listen($socket, 5)) {
die("socket_listen() 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n");
}
echo "서버가 시작되었습니다,감시 장치 {$host}:{$port}...\n";
while (true) {
// 4. 연결을 수락하십시오
$client = socket_accept($socket);
if ($client === false) {
echo "socket_accept() 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
// 5. 클라이언트 요청을 읽습니다
$input = socket_read($client, 1024);
$input = trim($input);
echo "요청을 받았습니다: $input\n";
// 분석 JSON 묻다
$request = json_decode($input, true);
$response = [];
if (json_last_error() === JSON_ERROR_NONE && isset($request['action'])) {
if ($request['action'] === 'ping') {
$response = ['status' => 'success', 'message' => 'pong'];
} elseif ($request['action'] === 'hello') {
$response = ['status' => 'success', 'message' => 'Hello from m66.net!'];
} else {
$response = ['status' => 'error', 'message' => '알 수없는 작업'];
}
} else {
$response = ['status' => 'error', 'message' => '묻다格式错误'];
}
// 응답을 보내십시오
$output = json_encode($response) . "\n";
socket_write($client, $output, strlen($output));
// 클라이언트 연결을 닫습니다
socket_close($client);
}
// 서버를 닫으십시오 socket(이론적으로는 결코 여기에 있지 않을 것입니다)
socket_close($socket);
?>
Telnet 또는 사용자 정의 클라이언트 도구를 사용하여 테스트에 연결할 수 있습니다.
telnet 127.0.0.1 9000
입력 페이스트 :
{"action":"ping"}
서버가 반환됩니다.
{"status":"success","message":"pong"}
보낼 수 있습니다.
{"action":"hello"}
응답 :
{"status":"success","message":"Hello from m66.net!"}
모든 입력 및 출력은 형식의 일관성을 보장해야하며 JSON을 프로토콜 본체로 사용하는 것이 좋습니다.
이 서버는 차단 중이며 학습 및 소규모 응용 프로그램에 적합합니다.
다중 스레드 또는 이벤트 기반 모델 (예 : Swoole)은 동시성 성능을 향상시키기 위해 생산 환경에서 사용해야합니다.
서비스가 공개 네트워크에 배포 된 경우 IP 화이트리스트, 암호화 검증 등과 같은 보안 제어를 보장해야합니다.
이 기사를 통해 php socket_accept ()를 사용하여 사용자 정의 프로토콜 서버를 만드는 방법을 배웠습니다. 기본 소켓 원칙에서 완전한 예에 이르기 까지이 접근법은 PHP의 응용 프로그램 경계를 확대 할뿐만 아니라 특정 시나리오에 대한 유연하고 안정적인 통신 기능을 제공합니다. 이 아키텍처는 일부 가벼운 서비스, 인트라넷 커뮤니케이션 또는 IoT 프로젝트에서 큰 잠재력을 가지고 있습니다.