> 백엔드 개발 > PHP 튜토리얼 > PHP의 소켓 사용법에 대한 자세한 설명

PHP의 소켓 사용법에 대한 자세한 설명

墨辰丷
풀어 주다: 2023-03-28 14:10:01
원래의
2171명이 탐색했습니다.

소켓의 원래 영어 의미는 "구멍" 또는 "소켓"입니다. BSD UNIX의 프로세스 통신 메커니즘으로는 후자의 의미를 갖는다. IP 주소와 포트를 설명하는 데 사용되며 통신 체인에 대한 핸들입니다. 인터넷상의 호스트는 일반적으로 여러 서비스 소프트웨어를 실행하고 동시에 여러 서비스를 제공합니다. 각 서비스는 소켓을 열고 이를 포트에 바인딩합니다. 서로 다른 포트는 서로 다른 서비스에 해당합니다.

   PHP 소켓 프로그래밍은 상대적으로 이해하기 어렵습니다. 그러나 우리는 여러 소켓 기능 간의 관계와 역할만 이해하면 됩니다. 이해하기 어렵지 않을 것입니다. 저자의 의견으로는 소켓 프로그래밍은 실제로 클라이언트가 무엇인지 이해하는 한 mysql의 클라이언트 및 서버와 동일한 네트워크 서비스의 클라이언트 및 서버를 설정하는 것입니다. 그리고 mysql의 서버에 대해서는 아래에서 제가 이야기하려는 내용을 이해하실 수 있을 것입니다.

  TCP, UDP, 소켓 3방향 핸드셰이크 등과 같은 소켓 프로그래밍과 관련된 네트워크 프로토콜에 대해서는 인터넷에 이러한 네트워크 프로토콜에 대한 매우 자세한 설명이 있으므로 여기서는 다루지 않겠습니다. 소켓 설정 과정을 스크린샷으로 찍어주세요:

        

  이 사진은 다른 사람이 공들여 훔친 것입니다. 동시에 저도 잘 살펴봐야 합니다. 저에게서 스크린샷을 훔친 작성자에게 감사의 말씀을 전하고 싶습니다. 귀하의 패턴을 도용한 것에 대해 사과드리며, 양해해 주시기 바랍니다. 저는 그림을 그리는 게 너무 게으른 편이에요(사실 그림 실력에 자신이 없다는 뜻이죠, 하하).

   소켓은 어떻게 연결을 설정하나요? 위에서 언급했듯이 연결을 설정하는 과정은 본질적으로 mysql 클라이언트와 서버 간의 연결과 동일합니다. 그것과 mysql의 차이점은 mysql의 서버와 클라이언트가 우리를 위해 편집되었기 때문에 그것을 적용하기만 하면 된다는 것입니다. 그러나 중요한 순간이 왔습니다. 소켓은 우리에게 아무것도 제공하지 않습니다. 소켓이 제공하는 유일한 것은 수십 개의 소켓 기능입니다.

 소켓 프로그래밍을 위해서는 서버와 클라이언트를 직접 만들어야 한다는 의미입니다. 즉, ``소켓 프로그래밍``은 mysql과 유사한 서버 및 클라이언트 애플리케이션을 구축해야 한다는 의미입니다.

  그런데 묻고 싶습니다. 이 소켓이 사람들에게 두통을 준다고 생각하시나요? 우리가 적용할 서버나 클라이언트를 생성하지도 않습니다. 우리가 직접 소켓 기능을 사용하고 자체 네트워크 프로토콜 소켓 애플리케이션을 생성해야 합니다. 이것이 머리가 아프지 않습니까? 자신만의 애플리케이션이 필요한 경우에는 여전히 소켓을 처리해야 합니다. 하하, 이건 그냥 여담이에요. 많이 말하지 않겠습니다. 요점만 말씀드리겠습니다.

   소켓 프로그래밍에 헷갈리기 전에 소켓의 몇 가지 주요 기능을 살펴보고 각 기능에 대해 먼저 설명하겠습니다. 그렇지 않고, 소켓 프로그래밍에 대한 기초가 전혀 없는 사람이 이 글을 읽는다면, 이 글을 읽고 나서 과감하게 이 글을 스킵하고 앞으로는 소켓에 대한 공포증이 생길까 두렵습니다. 하하, 더 말해 보세요.

  소켓의 주요 기능:

  socket_create($net 매개변수 1, $stream 매개변수 2, $protocol 매개변수 3)

   기능: 직설적으로 말하면 네트워크 데이터 스트림입니다.

  반환 값: 소켓 또는 false, 매개변수가 올바르지 않으면 E_WARNING 경고가 발행됩니다.

  PHP 온라인 매뉴얼에서 더 명확하게 설명합니다.

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

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

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

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

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

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

  AF_UNIX: 로컬 통신 프로토콜입니다. 고성능 및 저비용 IPC(프로세스 간 통신).

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

  SOCK_STREAM  SOCK_DGRAM  SOCK_SEQPACKET  SOCK_RAW  SOCK_RDM.

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

  SOCK_STREAM TCP 프로토콜 소켓.

 SOCK_DGRAM  UDP 프로토콜 소켓.

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

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

  SOL_TCP: TCP 프로토콜.

  SOL_UDP: UDP 프로토콜입니다.

   여기서 보면 실제로는 소켓_create 함수의 두 번째 매개변수와 세 번째 매개변수가 연관되어 있음을 알 수 있습니다.

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

  세 번째 매개변수는 SOL_TCP를 사용해야 하는데 이는 이해하기 어렵지 않습니다.

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

  핵심 함수 2:

  socket_connect($socket 매개변수 1, $ip 매개변수 2, $port 매개변수 3)

   함수: 소켓 연결, 반환 값은 true 또는 false

   매개변수 1: 소켓_create 값의 함수 반환

   매개변수 2: IP 주소

   매개변수 3: 포트 번호

   주요 기능 3:

  socket_bind($socket 매개변수 1, $ip 매개변수 2, $port 매개변수 3)

   기능: 소켓 바인딩 , 반환 값 참 아니면 거짓

                                                                   ″ ″ )

  함수: 소켓을 모니터링합니다. 반환 값은 true 또는 false입니다

  매개변수 1: 소켓_create의 함수 반환 값

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

  주요 기능 5:

  socket_accept($socket)

  함수 : 소켓 자원 정보 수신, 소켓 정보 자원 반환 성공, 실패는 false

   매개 변수 : 소켓_create의 함수 반환 값

  주요 함수 6:

  socket_read($socket 매개 변수 1, $length 매개변수 2)

함수: 소켓의 리소스 정보 읽기,

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

매개 변수 1: 소켓_create 또는 소켓_accept 함수 반환 값

   매개 변수 2 : 읽은 문자열의 길이

  주요 기능 7:

  socket_write($socket 매개 변수 1, $msg 매개 변수 2, $strlen 매개 변수 3)

   기능: 소켓에 데이터 쓰기

  반환 값: 성공적으로 바이트를 반환합니다. 문자열의 길이, 실패는 false

매개 변수입니다. 1 : socket_create 또는 socket_accept

의 함수 반환 값 in in in in in in in in in in in in in in in

:

socket_close ($ socket).

: 세트 피스 닫기

반환 값: TRUE, False로 반환 성공

매개 변수: Socket_create 또는 Socket_accept, 두 가지 더 중요한 함수는 아래에 나열되어 있습니다

  socket_last_error($socket), 매개 변수는 다음의 반환 값입니다. 소켓_create의 함수는 소켓의 마지막 오류 코드 번호를 가져오는 것이며 반환 값은 소켓 코드

  socket_strerror($code), 매개 변수는 소켓_last_error 함수의 반환 값, 코드의 문자열 정보입니다. 반환 값은 소켓의 오류 메시지이기도 합니다. 이 두 함수는 소켓 프로그래밍에서 여전히 매우 중요하며, 특히 초보자에게 사용할 수 있습니다. 디버깅

  

  다음은 코드입니다. 제 댓글을 주의 깊게 읽어주세요. 세 번 외쳐주세요.

  서버 측 스크립트, 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);
로그인 후 복사

  팁: 위의 세 가지 기능인 소켓_bind, 소켓_청취, 소켓_accept의 실행 순서는 변경할 수 없습니다. 즉,

  socket_bind를 먼저 실행해야 합니다. 그런 다음 소켓_수신, 그리고 마지막으로 소켓_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,&#39;127.0.0.1&#39;,8888) == false){
    echo &#39;connect fail massege:&#39;.socket_strerror(socket_last_error());
  }else{
    $message = &#39;l love you 我爱你 socket&#39;;
    //转为GBK编码,处理乱码问题,这要看你的编码情况而定,每个人的编码都不同
    $message = mb_convert_encoding($message,&#39;GBK&#39;,&#39;UTF-8&#39;);
    //向服务端写入字符串信息

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

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

                       D:vhosttestsocketclient_socket.php     이 두 스크립트를 테스트하는 방법은 무엇입니까?

   먼저 cmd 블랙 윈도우인 Windows DOS 창을 열고 PHP D:vhosttestsocketserver_socket.php를 실행합니다.

  서버측 블랙 윈도우를 계속 실행합니다.

  두 번째로 PHP 클라이언트 스크립트를 실행할 수 있습니다. 브라우저를 통해 다른 cmd 검정 창을 열어

  php D:vhosttestsocketclient_socket.php

  여기에 참고하세요: 추가하는 방법을 모르는 경우 PHP 실행 이름을 Windows 환경 변수에 추가해야 합니다.

  php 실행 명령어를 입력해주세요 절대 명령어로 디렉터리를 실행하거나, 바이두의 환경 변수에 php 명령어를 추가할 수 있습니다

  이건 제 상황입니다. 파일 주소가 저와 다를 수 있으니 그에 맞게 조작해주세요 주소로 보내지 않으면 결과에 대한 책임은 본인에게 있습니다. 하하

  위에서 언급했듯이 소켓 프로그래밍에는 통신을 위한 서버가 필요하므로 서버의 검은 창을 열어두어야 합니다.

  추신:

socket_set_option($socket 매개변수 1, $level 매개변수 2, $optname 매개변수 3, $optval 매개변수 4)

이 함수의 기능은 소켓에 대한 데이터 흐름 옵션을 설정하는 것인데, 이는 여전히 매우 까다롭습니다. 중요합니다.

매개변수 1: 소켓_create 또는 소켓_accept의 함수 반환 값

매개변수 2: SOL_SOCKET, 이 옵션만 있는 것 같습니다.

매개변수 3은 매개변수 4와 관련이 있으며,

매개변수 3은 다음과 같을 수 있습니다. 분명하다 :

SO_REUSEADDR 소켓 포트를 해제한 후 즉시 다시 사용할 수 있도록 하기 위한 것입니다

    매개변수 3이 이것이면 매개변수 4는 true 또는 false가 될 수 있습니다

SO_RCVTIMEO   소켓이 수신하는 최대 타임아웃 시간입니다 resources

SO_SNDTIMEO 소켓의 송신 자원의 최대 타임아웃

 파라미터 3이 이 둘이면 파라미터 4는 이런 배열 배열입니다('sec'=>1,'usec'=>500000)

 타임아웃을 설정하는 최대 시간은 배열에 설정되어 있습니다. 단, 하나는 초 단위이고 다른 하나는 마이크로초 단위입니다.

위 내용이 이 글의 전체 내용이기를 바랍니다. 모두의 학습에 도움이 됩니다.

관련 추천:

PHP에서 일반적으로 사용되는 매직 메소드에 대한 자세한 설명


PHP에서 쿠키를 사용하는 방법에 대한 자세한 설명


한자 깨짐 문제를 해결하는 PHP 메소드


위 내용은 PHP의 소켓 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿