>  기사  >  php教程  >  PHP의 소켓 통신 메커니즘 예제에 대한 자세한 설명

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

高洛峰
高洛峰원래의
2016-12-22 09:51:151086검색

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

1. 소켓이란 무엇입니까?

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

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

2. 소켓 서버 server.php

<?php  
// 建立server端socket  
$tcp = getprotobyname("tcp");  
$socket = socket_create(af_inet, sock_stream, $tcp);  
socket_bind($socket, &#39;127.0.0.1&#39;, 10008);       //绑定要监听的端口  
socket_listen($socket);       //监听端口 
 
//初始化一个数据,和客户端通信  
$buffer = "connect";  
while (true) {  
    // 接受一个socket连接  
    $connection = socket_accept($socket);  
    if(!$connection){  
        echo "connect fail";  
    }else{  
            echo  "socket connected ";  
            // 向客户端传递一个信息数据  
            if ($buffer != "") {  
                echo "send data to client ";  
                socket_write($connection, $buffer . " ");  
                echo  "wrote to socket ";  
            } else {  
                echo  "no data in the buffer " ;  
            }  
            // 从客户端取得信息  
            while ($data = @socket_read($connection, 1024, php_normal_read)) {  
                    printf("buffer: " . $data . " ");  
                    //取得信息给客户端一个反馈  
                    socket_write($connection, "information received ");  
            }
    } 
 
    socket_close($connection);  
    //关闭 socket  
    printf("closed the socket ");  
}  
?>

3. 소켓 클라이언트 client.php

<?php  
// 建立客户端的socet连接  
$socket = socket_create(af_inet, sock_stream, sol_tcp);  
$connection = socket_connect($socket, &#39;127.0.0.1&#39;, 10008);    //连接服务器端socket 
 
while ($buffer = @socket_read($socket, 1024, php_normal_read)) {  
    //服务端告诉客户端,自己的状态  
    if (preg_match("/not connect/",$buffer)) {  
        echo "don`t connect ";  
        break;  
    } else {  
        //服务器传来信息  
        echo "buffer data: " . $buffer . " "; 
 
        echo "writing to socket ";  
        // 将客户的信息写到通道中,传给服务器端  
        if (!socket_write($socket, "some data ")) {  
            echo "write failed ";  
        }  
        //服务器端收到信息后,给于的回应信息  
        while ($buffer = socket_read($socket, 1024, php_normal_read)) {  
                echo "sent to server: some data response from server was:" . $buffer . " ";  
        } 
 
    }  
} 
?>

4. 고려 시간이 끝나면 자동으로 소켓을 닫습니다)

설명하기 전에 클라이언트의 경우 php 명령을 사용해야 하는 이유를 말씀드리고 싶습니다. fsockopen을 사용하면 검색할 수 있습니다. 서버에서 액세스하면 연결 시간이 초과됩니다. 소켓을 생성하면 클라이언트가 연결을 원하는지 지속적으로 모니터링하기 때문입니다.

소켓 통신을 설정하려면 두 개의 소켓 채널이 필요합니다. 하나는 서버에서 생성되고 다른 하나는 클라이언트에서 생성됩니다.

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

2라인, 클라이언트가 소켓 채널을 생성하고 서버에 연결합니다. 서버는 정보와 통신하여

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

라인 4로 보내고 클라이언트는 서버

로부터 확인 정보를 얻습니다. 이 시점에서 데이터 전송이 완료되면 통신이 완료됩니다. , 서버 연결이 끊어집니다 소켓 통신, 구체적인 작업은 다음과 같습니다.

1 소켓 서버 실행

[root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/server.php 
interactive mode enabled

이 시점에서 어떤 작업이 수행되었는지

a 10008 포트 듣기

[zhangy@blackghost ~]$ netstat -an |grep listen |grep 10008
tcp        0      0 127.0.0.1:10008    0.0.0.0:*      listen
[zhangy@blackghost ~]$

b 캐시로 정보 보내기

$buffer = "connect";

위 코드 보기

2 소켓 클라이언트 실행

[root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/client.php 
interactive mode enabled 
 
buffer data: connect 
 
writing to socket 
sent to server: some data 
response from server was:information received

3 서버로 돌아가기

[root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/server.php 
interactive mode enabled 
 
socket connected 
send data to client 
wrote to socket 
buffer: some data 
 
closed the socket

이 글이 모든 분들의 PHP 프로그래밍에 도움이 되기를 바랍니다.

PHP의 소켓 통신 메커니즘 예제와 관련 기사에 대한 자세한 설명은 PHP 중국어 웹사이트를 참고하세요!


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