>백엔드 개발 >PHP 튜토리얼 >PHP에서 소켓 프로그래밍의 자세한 예

PHP에서 소켓 프로그래밍의 자세한 예

小云云
小云云원래의
2018-03-29 11:51:497036검색

socketprogramming, what TCPah, UDPah, what socket3방향 핸드셰이크 등에 관련된 네트워크 프로토콜에 대해 이러한 네트워크 프로토콜은 매우 상세합니다. 온라인에서는 여기서 설명을 설명하지 않지만 여러분이 볼 수 있도록 소켓을 설정하는 과정의 스크린샷을 찍겠습니다. 가로채기 예, 동시에 잘 살펴보아야 합니다. 또한 저에게서 스크린샷을 훔친 작성자에게 감사의 말씀을 전하고 싶습니다. 귀하의 패턴을 도용한 것에 대해 사과드립니다. 저는 그림을 그리는 게 너무 게으른 편이에요(사실 그림 실력에 자신이 없다는 뜻이죠, 하하).     
socket

은 어떻게 연결을 설정하나요? 위에서 언급했듯이 연결을 설정하는 과정은 기본적으로

mysql의 클라이언트와 서버 간의 연결과 동일합니다.

mysql

과의 차이점은 mysql

의 서버와 클라이언트가 편집되었기 때문에 적용하기만 하면 된다는 것입니다. 그러나 중요한 순간이 왔습니다. socket은 우리에게 아무것도 제공하지 않으며, 우리에게 제공하는 유일한 것은 수십 개의 socket 기능뿐입니다.

  의미는 socket프로그래밍을 위해서는 서버와 클라이언트를 직접 만들어야 한다는 것입니다. 즉, ``socketprogramming``——에서는 유사한 서버와 클라이언트를 구축해야 합니다. mysql용 애플리케이션.

그러고보니 묻고 싶은게 이 소켓이 사람들을 골치 아프게 한다고 생각하시나요? 우리가 신청할 수 있는 서버도 클라이언트도 생성하지 않습니다. 우리가 직접 socket 기능을 사용하여 자체 네트워크 프로토콜 소켓 애플리케이션을 만들어야 합니다. 당황스럽지 않나요? 골치 아픈 문제에 대한 해결책은 없습니다. 자신만의 애플리케이션이 필요한 경우에도 socket을 처리해야 합니다. 하하, 이건 그냥 여담이에요. 많이 말하지 않겠습니다. 요점만 말씀드리겠습니다.

   socket프로그래밍으로 혼란스러워지기 전에 socket의 몇 가지 주요 기능을 살펴보고 해당 기능에 대해 먼저 설명하겠습니다. 그렇지 않고 socket프로그래밍에 대한 기본 지식이 없는 사람이 이 글을 읽는다면, 이 글을 과감히 건너뛰고 socket 공포증에 빠질까 두렵습니다. 하하, 제가 더 말했어요.

   socket1의 주요 기능:

    socket_create($netparameter1,$streamparameter2,$protocol매개변수 3)

  기능: socketSocket 단어, 직설적으로 말하면은 네트워크 데이터 흐름입니다.

   반환 값: 소켓 또는 false, 매개변수 오류가 발생함 E_WARNINGWarning

  php 온라인 매뉴얼을 보면 더 명확해집니다.

   소켓_create통신 노드라고도 불리는 소켓을 생성하고 반환합니다. 일반적인 네트워크 연결은 2 소켓으로 구성됩니다. 하나는 클라이언트 측에서 실행되고 다른 하나는 서버 측에서 실행됩니다.

위 문장은 php 온라인 매뉴얼에서 복사한 것입니다. 여기서의 의미가 위에서 반복적으로 언급한 클라이언트 및 서버와 완전히 동일하다는 것을 알 수 있습니까? 헤헤.

   매개변수 1는 네트워크 프로토콜,

입니다.

 네트워크 프로토콜은 무엇입니까? 옵션은 다음 세 가지입니다:

  AF_INET:  IPv4 네트워크 프로토콜. TCP UDP 모두 이 프로토콜을 사용할 수 있습니다. 이것은 일반적으로 사용됩니다.

   AF_INET6: IPv6 네트워크 프로토콜. TCP UDP 모두 이 프로토콜을 사용할 수 있습니다.

  AF_UNIX:  로컬 통신 프로토콜. IPC(프로세스 간 통신)은 고성능과 저렴한 비용을 제공합니다.

2 : 소켓 스트림, 옵션은 다음과 같습니다.

   여기서는 처음 두 개만 설명합니다:

  SOCK_STREAM  TCP 프로토콜 소켓.

  SOCK_DGRAM  UDP 프로토콜 소켓.

  자세한 내용은 여기에 링크하세요:http://php.net/manual/zh/function.socket-create.php

   매개변수 3: 프로토콜프로토콜 , 옵션은 다음과 같습니다:

  SOL_TCPTCP 프로토콜.

  SOL_UDP: UDP프로토콜.

     ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​여기에서 볼 수 있듯이 실제로 socket_create 함수의 두 번째 매개변수와 세 번째 매개변수는 서로 연관되어 있습니다.

 예를 들어 첫 번째 매개변수가 IPv4 프로토콜을 사용하는 경우: AF_INET, 두 번째 매개변수가 TCP 소켓을 사용하는 경우: SOCK_STREAM,

   그럼 세 번째 매개변수는 SOL_TCP, 이어야 합니다. 이해하기 어렵지 않습니다.

  TCP 프로토콜 소켓은 당연히 TCP 프로토콜만 사용할 수 있겠죠? UDP 소켓을 사용한다면 세 번째 매개변수를 선택하는 방법은 언급하지 않겠습니다. 하하.

주요 기능 2

socket_connect($socketparameters1, $ipparameter 2, $portparameter 3)

   함수: 소켓을 연결합니다. 반환 값은 true 또는 false

   매개변수 1: socket_create의 함수 반환 값입니다.

  Parameter2 ipAddress

  매개변수3:포트 번호

주요 기능3:

  socket_bind($socketparameter1 ,$ipparameter2,$portparameter3)

기능: 소켓을 바인딩하고, 반환 값은 true 또는 false

입니다. 매개변수 1: socket_create

의 함수 반환 값ㅋㅋㅋ               �        

 주요 기능 4  socket_listen( $socketparameter1,$backlog

parameter

2)  기능: 소켓 모니터링, 반환 값 true

또는

false

  

parameter

1 : socket_create 함수 반환 값

  매개변수 2: 최대 청취 소켓 수

​주요 기능 5:

   socket_accept($socket)

                                                                                                           우리 in in in in 가치

  주요 기능 6

   socket_read($socket 매개 변수 1, $length 매개변수 2)   기능: 소켓 리소스 정보 읽기,

   반환 값: 소켓 리소스를 문자열 정보로 성공적으로 변환, 실패는 false

                                     함수 반환 값

 파라미터 2: 읽은 문자열의 길이

 주요 기능

7

:

  socket_write($socketparameter1,$msgparameter2,$strlenparameter3)

  기능: Medium 소켓에 데이터 쓰기

반환 값: 문자열의 바이트 길이를 성공적으로 반환했으며, 실패하면 false

   매개변수 1: socket_create 또는 socket_accept 함수 반환 값

   매개변수 2: 문자열

  매개변수 3: 문자열의 길이

 주요 기능 8:

  socket_close($socket)

기능: 소켓 닫기

ㅋㅋㅋㅋㅋㅋㅋㅋㅋ                                                                             ulous

) |   이 8개의 함수는 socket

의 핵심 함수입니다. 여기에 두 가지 더 중요한 함수

  가 반환값입니다. 소켓의 마지막 오류를 가져오는 데 사용되는 socket_create의 값입니다. 코드 번호, 반환 값 소켓

code

  socket_strerror($code), 매개 변수는 socket_last_error입니다. 함수의 반환 값은

code의 문자열 정보를 가져옵니다. 반환 값은 소켓 오류 메시지   입니다. 이 두 함수는 socket 프로그래밍에서 여전히 매우 중요합니다. 프로그래밍, 특히 초보자의 경우 디버깅에 사용할 수 있습니다.ㅋㅋㅋㅋㅋ eration] 제 댓글을 잘 읽어보세요. 댓글은 매우 중요합니다. 중요한 것은 세 번 외쳐야 합니다.

   서버 스크립트, D: vhosttestsocketserver_socket.php

 


<?php//创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);    /*绑定接收的套接流主机和端口,与客户端相对应*/
    if(socket_bind($socket,&#39;127.0.0.1&#39;,8888) == false){        echo &#39;server bind fail:&#39;.socket_strerror(socket_last_error());        /*这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址*/
    }    //监听套接流
    if(socket_listen($socket,4)==false){        echo &#39;server listen fail:&#39;.socket_strerror(socket_last_error());
    }//让服务器无限获取客户端传过来的信息do{    /*接收客户端传过来的信息*/
    $accept_resource = socket_accept($socket);    /*socket_accept的作用就是接受socket_bind()所绑定的主机发过来的套接流*/

    if($accept_resource !== false){        /*读取客户端传过来的资源,并转化为字符串*/
        $string = socket_read($accept_resource,1024);        /*socket_read的作用就是读出socket_accept()的资源并把它转化为字符串*/

        echo &#39;server receive is :&#39;.$string.PHP_EOL;//PHP_EOL为php的换行预定义常量
        if($string != false){            $return_client = &#39;server receive is : &#39;.$string.PHP_EOL;            /*向socket_accept的套接流写入信息,也就是回馈信息给socket_bind()所绑定的主机客户端*/
            socket_write($accept_resource,$return_client,strlen($return_client));            /*socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息*/
        }else{            echo &#39;socket_read is fail&#39;;
        }    /*socket_close的作用是关闭socket_create()或者socket_accept()所建立的套接流*/
        socket_close($accept_resource);
    }
}while(true);
socket_close($socket);

팁: d 위의 소켓_bin에 주의하세요. 세 가지 함수 Socket_listen 및 Socket_accept의 실행 순서 , 즉,

  socket_bind를 먼저 실행한 다음,socket_listen을 실행하고, 마지막으로socket_accept

   클라이언트 스크립트, D: vhosttestsocketclient_socket.php

<?php    //创建一个socket套接流
    $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);    /****************设置socket连接选项,这两个步骤你可以省略*************/
     //接收套接流的最大超时时间1秒,后面是微秒单位超时时间,设置为零,表示不管它
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));     //发送套接流的最大超时时间为6秒
    socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 6, "usec" => 0));    /****************设置socket连接选项,这两个步骤你可以省略*************/

    //连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系
    if(socket_connect($socket,'127.0.0.1',8888) == false){        echo 'connect fail massege:'.socket_strerror(socket_last_error());
    }else{        $message = 'l love you 我爱你 socket';        //转为GBK编码,处理乱码问题,这要看你的编码情况而定,每个人的编码都不同
        $message = mb_convert_encoding($message,'GBK','UTF-8');        //向服务端写入字符串信息

        if(socket_write($socket,$message,strlen($message)) == false){            echo 'fail to write'.socket_strerror(socket_last_error());

        }else{            echo 'client write success'.PHP_EOL;            //读取服务端返回来的套接流信息
            while($callback = socket_read($socket,1024)){                echo 'server return message is:'.PHP_EOL.$callback;
            }
        }
    }
    socket_close($socket);//工作完毕,关闭套接流



  

이 두 스크립트를 테스트하는 방법은 무엇입니까?

                              로그인 in ¢?? 스크립트는 브라우저를 통해 실행하거나 cmd 검정 창을 열어 실행할 수 있습니다

   php D:vhosttestsocketclient_socket.php

                                      넘어주세요 참고: Windows 환경 변수에 php 실행 이름을 추가해야 합니다. 추가 방법을 모르시면

   php 실행 명령 디렉터리에 들어가서 절대 명령으로 실행하셔도 됩니다. Baidu

의 환경 변수에 대한 php 명령你 이게 제 상황입니다. 귀하의 파일 주소가 저와 다를 수 있습니다. 그렇지 않으면 결과는 귀하의 책임입니다. ㅎㅎ ​

이미 소켓 프로그래밍에 서버가 있어야 한다고 말했습니다. 통신을 하기 위해서는 서버의 검은 창을 열어두어야 합니다.

  추신 추가됨:

socket_set_option

($socketparameter1 , $level 매개변수 2, $optname parameters 3, $optval parameters4)

이 함수는 소켓에 대한 데이터 흐름 옵션을 설정하는 데 사용되는 함수이기도 하며 매우 중요한 함수입니다.

Parameter 1: socket_create 또는 socket_accept

Parameter2의 함수 반환 값 : SOL_SOCKET, 이런 것 같아요 유일한 선택

매개변수 34 매개변수와 관련됩니다.

매개변수 3는 다음과 같습니다. SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEO

설명:

so_so_reuseaddr은 소켓 포트가 릴리스 직후에 다시 사용될 수 있도록하는 것입니다.

SO_SNDTIMEO 

는 소켓의 전송 자원

이 매개변수 3 2인 경우 매개변수 4는 다음과 같은 배열입니다. array('sec' =>1,'usec'=>500000)

 최대 시간 초과 시간은 배열에 설정되어 있지만 하나는 초 단위이고 다른 하나는 마이크로초 단위이며 효과는 동일합니다

관련 권장 사항:

PHP의 소켓 프로그래밍에 대한 자세한 설명

위 내용은 PHP에서 소켓 프로그래밍의 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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