>백엔드 개발 >PHP 튜토리얼 >php_php 스킬의 소켓 통신 메커니즘 예제에 대한 자세한 설명

php_php 스킬의 소켓 통신 메커니즘 예제에 대한 자세한 설명

WBOY
WBOY원래의
2016-05-16 20:26:441004검색

이 기사의 예에서는 PHP의 소켓 통신 메커니즘과 사용법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

1.소켓이란

소켓이란 무엇입니까? 소위 소켓은 일반적으로 IP 주소와 포트를 설명하는 데 사용되는 "소켓"이라고도 합니다. 응용 프로그램은 일반적으로 "소켓"을 통해 네트워크에 요청하거나 네트워크 요청에 응답합니다. 직설적으로 말하면 의사소통 메커니즘이다. 은행, 통신 및 기타 부서의 전화 고객 서비스 부서와 유사합니다. 전화를 걸면 귀하의 질문에 답할 사람이 배정됩니다. 고객 서비스 부서는 소켓의 서버 측에 해당하며 귀하와 통화가 끝나기 전에는 누군가가 불가능합니다. 물론, 고객 서비스 부서의 전화 교환대는 중복되지 않습니다.

소켓이 어떻게 작동하는지 설명하기 위해 아래 예를 들어보겠습니다. Application Layer를 기반으로 개발을 한다면 반드시 원리를 이해할 필요는 없지만 알아두면 좋습니다. 인터넷에는 소켓에 관한 PHP API가 있습니다. 그냥 내려놓고 사용하세요.

2. 소켓 서버 server.php

코드 복사 코드는 다음과 같습니다.
// 서버측 소켓 생성
$tcp = getprotobyname("tcp")
$socket = 소켓_생성(af_inet, sock_stream, $tcp)
소켓_bind($socket, '127.0.0.1', 10008); //모니터링할 포트를 바인딩합니다
소켓_listen($socket); //수신 포트

//데이터 초기화 및 클라이언트와 통신
$buffer = "연결"
동안(참) {
// 소켓 연결 수락
$connection = 소켓_수용($socket)
If(!$연결){
echo "연결 실패"; }그밖에{
echo "소켓이 연결되었습니다"; // 클라이언트에 정보 데이터 보내기
If ($buffer != "") {
echo "클라이언트에 데이터 보내기";                       소켓_write($connection, $buffer . " "); echo "소켓에 썼습니다"; ~ echo "버퍼에 데이터가 없습니다."
~                             // 클라이언트로부터 정보 얻기
                 while ($data = @socket_read($connection, 1024, php_normal_read)) {
Printf("버퍼: " . $data . " "); //정보를 얻고 고객에게 피드백을 제공합니다
소켓_write($connection, "정보 수신됨")
            }
}

​ 소켓_닫기($connection);
//소켓 닫기
Printf("소켓을 닫았습니다"); }
?>


3. 클라이언트 client.php





코드 복사

코드는 다음과 같습니다.
// 클라이언트 소켓 연결 설정
$socket = 소켓_create(af_inet, sock_stream, sol_tcp)
$connection = 소켓_connect($socket, '127.0.0.1', 10008); //서버 소켓에 연결

while ($buffer = @socket_read($socket, 1024, php_normal_read)) {
//서버는 클라이언트에게 상태를 알려줍니다
If (preg_match("/not connect/",$buffer)) {
echo "연결하지 마세요"; 휴식
} 다른 {
//서버에서 보낸 정보
echo "버퍼 데이터: " . $buffer

echo "소켓에 쓰기"
//고객의 정보를 채널에 쓰고 서버에 전달
If (!socket_write($socket, "some data ")) {
echo "쓰기 실패"; ~ //서버가 정보를 받은 후 응답 정보를 제공합니다
while ($buffer = 소켓_read($socket, 1024, php_normal_read)) {
echo "서버로 전송됨: 서버의 일부 데이터 응답:" . " ";            }

}  
}
?>


4. 통신 메커니즘 사진(대기 시간에 관계없이 자동으로 소켓 닫기)

간단히 설명하기 전에 서버와 클라이언트를 실행하기 위해 php 명령을 사용해야 하는 이유에 대해 말씀드리고 싶습니다. 클라이언트의 경우 브라우저에서 액세스할 수 있도록 fsockopen을 사용하고, 연결 시간이 초과됩니다. 소켓을 생성하면 클라이언트가 연결을 원하는지 지속적으로 모니터링하기 때문입니다. 소켓 통신을 설정하려면 두 개의 소켓 채널이 필요합니다. 하나는 서버에서 생성되고 다른 하나는 클라이언트에서 생성됩니다.

라인 1, 서버는 소켓 채널을 생성하고 정보를 캐시에 넣은 후 클라이언트의 연결을 기다립니다

2번째 라인에서는 클라이언트가 소켓 채널을 생성하여 서버에 접속하고, 통신을 위한 서버 측 정보를 얻어서 전송할 정보를 채널로 보냅니다.

3번째 줄에서는 서버가 클라이언트로부터 정보를 받아 클라이언트에게 정보를 받았다고 알려줍니다. 전송할 정보를 채널로 전송

4번째 줄, 클라이언트가 서버로부터 확인 정보를 얻습니다

이 시점에서 데이터 전송이 완료된 후 서버는 소켓 통신을 끊습니다.

1 소켓 서버 실행


코드 복사

이에 대해 어떤 작업을 하셨나요?

10008 포트를 들었습니다


코드 복사

[zhangy@blackghost ~]$

b 캐시로 정보 보내기

코드 복사

2 소켓 클라이언트 실행


코드 복사

버퍼 데이터: 연결

소켓에 쓰기
서버로 전송됨: 일부 데이터
서버의 응답은 다음과 같습니다:정보 수신됨

3 서버로 돌아가기
코드 복사 코드는 다음과 같습니다.
[root@blackghost zhangy]# /usr/local/php/bin /php - /home/zhangy/www/test2/server.php
대화형 모드 활성화

소켓 연결
클라이언트에 데이터 보내기
소켓에 썼습니다
버퍼: 일부 데이터

소켓을 닫았습니다

이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.