>  기사  >  백엔드 개발  >  PHP에서 소켓을 구현하는 방법

PHP에서 소켓을 구현하는 방법

小云云
小云云원래의
2018-03-31 14:09:525132검색

이 기사에서는 주로 텍스트와 코드 형식으로 PHP에서 소켓을 구현하는 방법을 공유합니다.

1. 소켓 소개
1. 소켓은 단지 데이터 구조일 뿐입니다.
2. 이 소켓 데이터 구조를 사용하여 클라이언트와 서버 간의 세션을 시작하세요.
3. 서버는 항상 새로운 세션 생성을 듣고 준비하고 있습니다. 클라이언트가 서버에 연결되면 서버가 세션을 수신하는 포트를 엽니다.
4. 서버는 클라이언트의 연결 요청을 수락한 다음 루프를 수행합니다. 이제 클라이언트는 서버에 정보를 보낼 수 있고, 서버는 클라이언트에 정보를 보낼 수 있습니다.

2. 소켓 변수
소켓을 생성하려면 프로토콜, 소켓 유형, 공용 프로토콜 유형의 세 가지 변수가 필요합니다.

1. 프로토콜

소스 코드 보기, 클립보드에 복사 및 도움말 인쇄

  1. AF_INET

  2. //소켓을 생성하고 전송을 위해 TCP 또는 UDP를 사용하며 IPv4 주소에서 사용되는 프로토콜

  3. ㅋㅋㅋ Unix에서 사용되는 로컬 프로토콜 Linux 시스템에서는 거의 사용되지 않으며 일반적으로 클라이언트와 서버가 동일한 시스템에 있을 때

  4. 2. 소켓 유형

    클립보드 인쇄 도움말로 소스 코드 복사 보기
  5. SOCK_STREAM
  6. //이 프로토콜 순차적이고 안정적인 데이터 통합 ​​바이트 스트림 기반 연결입니다. 가장 일반적으로 사용되는 소켓 유형입니다. 이 소켓은 전송에 TCP를 사용합니다.
  7. SOCK_DGRAM

//이 프로토콜은 연결이 없는 고정 길이 전송 호출입니다. 이 프로토콜은 신뢰할 수 없으며 연결에 UDP를 사용합니다.

  1. SOCK_SEQPACKET

  2. //이 프로토콜은 전송을 위해 고정 길이 데이터 패킷을 보내는 안정적인 2라인 연결입니다. 이 패킷을 읽으려면 먼저 완전히 수락해야 합니다.

  3. SOCK_RAW

  4. //이 소켓 유형은 단일 네트워크 액세스를 제공합니다. ICMP 공용 프로토콜을 사용합니다. (ping 및 Traceroute는 이 프로토콜을 사용합니다.)

  5. SOCK_RDM

  6. //이 유형은 거의 사용되지 않으며 대부분의 운영 체제에서 구현되지 않습니다. 데이터 패킷은 보장되지 않습니다

  7. 3. 공개 프로토콜

    클립보드에 있는 소스 코드 사본 보기 및 도움말 인쇄
  8. ICMP
  9. //인터넷 제어 메시지 프로토콜, 주로 게이트웨이 및 호스트에서 사용되며 확인하는 데 사용됩니다. 네트워크 상태 및 보고 오류 정보
  10. UDP

//사용자 데이터그램 프로토콜, 연결이 없고 신뢰할 수 없는 전송 프로토콜입니다.

  1. TCP

  2. //전송 제어 프로토콜은 가장 일반적으로 사용되는 신뢰할 수 있는 공용 프로토콜로, 데이터 패킷이 수신자에게 도달할 수 있도록 보장합니다. 전송 프로세스 중에 오류가 발생하면 오류 패킷을 다시 보냅니다.

  3. 3.소켓 함수

    1.socket_create

    함수: 소켓 데이터 구조 생성과 동일합니다.
  4. 사용법:socket_create(int 도메인, int 유형, int 프로토콜)
  5. 매개변수: 도메인, 프로토콜; , Type; 프로토콜, 공용 프로토콜

    Return: 성공 시 소켓 리소스, 오류 시 FALSE

  6. 2.socket_bind
  7. Function: 소켓을 IP 주소 및 포트에 바인딩

    Usage: 소켓_bind(리소스 소켓, 문자열 주소 [, int 포트 ] )

    매개변수: 소켓, 소켓 리소스, IP 주소, 포트
  8. 반환: 부울
  9. 3.socket_accept
    함수: 소켓 연결 수락
    사용법: 소켓_accept(리소스 소켓)
    매개변수: 소켓, 소켓 리소스
    반환: 성공 시 새 소켓 리소스를 반환하거나 오류 시 FALSE를 반환합니다.

    4. 기능: 소켓 연결 시작
    사용법: 소켓_연결(리소스 소켓, 문자열 주소 [, int 포트])
    매개변수: 소켓, 소켓 리소스; 주소, IP 주소, 포트
    반환: Boolean

    5, 소켓_listen

    기능: 지정된 소켓의 모든 연결을 수신합니다
    사용법: 소켓_listen(리소스 소켓 [, int backlog])
    매개변수: 소켓, 소켓 리소스;
    반환: Boolean

    6, 소켓_read

    기능: 지정된 길이의 데이터 읽기
    사용법: 소켓_read(리소스 소켓, int 길이 [, int 유형])
    매개변수: 소켓, 소켓 리소스; 길이, 문자 길이; 유형, PHP_BINARY_READ |PHP_NORMAL_READ
    Return: 문자열

    7, 소켓_write

    기능: 소켓 캐시에 데이터 쓰기
    사용 : 소켓_쓰기(리소스 소켓, 문자열 버퍼[, 정수 길이])
    파라미터: 소켓, 소켓 리소스;버퍼, 문자 길이, 문자 길이;
    Return: Boolean

    8. 이 함수는 데이터를 보냅니다. 연결된 소켓

    사용법: 소켓_전송(리소스 소켓, 문자열 buf, int len, int 플래그)
    매개변수: 소켓, 소켓 리소스;buf, 문자; len, 문자 길이;
    반환: Boolean

    9, 소켓_last_error

    기능: 가져오기 현재 소켓의 마지막 오류 코드

    사용법:socket_last_error([리소스 소켓])
    매개 변수:socket,socketresource;
    Return:int

    10,socket_strerror

    기능:지정된 오류 번호의 자세한 오류를 반환합니다

    사용법:socket_strerror (int errno )
    매개변수: errno, 소켓_last_error no;
    Return: 문자열

    11, 소켓_close

    Function: 소켓 리소스 닫기

    Usage: 소켓_close([리소스 소켓])
    매개변수: 소켓, 소켓 리소스;
    Return: null

    4, 사용 지침

    소켓을 여는 방법을 확인하세요

    a. PHP.ini 파일을 편집하고 Extension=php_sockets.dll의 이전 주석을 제거하세요.
    b 확장 라이브러리를 로드하는 코드

    소스 보기 코드를 작성하고 클립보드에 복사하여 도움말을 인쇄하세요

      if(!extension_loaded('sockets')) {
    1. if(strtoupper(substr(PHP_OS, 0, 3)) == "WIN") {
    2. dl('php_sockets.dll');
    3. }else{
    4. dl('sockets.so')
    5. }
    6. }
    7. 5. 소켓 프로그래밍

    1. 서버 측

    기능:

    a, 초기화 소켓이 열리고 버퍼가 열려 데이터를 보내고 받습니다.


    b. 연결이 생성되면 서버 측 화면에 "소켓 연결됨"이 인쇄됩니다.

    c. 서버는 버퍼에 데이터가 있는지 확인하여 연결된 컴퓨터로 데이터를 보냅니다.

    그런 다음 이 데이터에 대한 수락 메시지를 보냅니다. 메시지를 수락하면 메시지를 데이터에 저장하고 연결된 컴퓨터에 메시지를 알리고 마지막으로 연결을 닫습니다.


    d. 연결이 종료된 후 서버는 다음 연결 처리를 시작합니다.

    소스 코드를 보고 클립보드에 복사하여 도움말을 인쇄하세요

    // 获取协议  
    $commonProtocol = getprotobyname("tcp");  
      
    //产生一个socket  
    $socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);  
      
    //把socket绑定在一个IP地址和端口上  
    socket_bind($socket, 'localhost', 1337);   
      
    //监听由指定socket的所有连接  
    socket_listen($socket);  
      
    //初始化buffer  
    $buffer = "NO DATA";  
    while(true) {  
        //接受一个Socket连接  
        $connection = socket_accept($socket);  
        printf("Socket connected\r\n");  
      
        // 检测 buffer  
        if($buffer != ""){  
            printf("Something is in the buffer...sending data...\r\n");  
            //写数据到socket缓存  
            socket_write($connection, $buffer . "\r\n");  
            printf("Wrote to socket\r\n");  
        }else {  
            printf("No Data in the buffer\r\n");  
        }  
      
        //读取指定长度的数据  
        while($data = socket_read($connection, 1024, PHP_NORMAL_READ))  
        {  
            $buffer = $data;  
            //写数据到socket缓存  
            socket_write($connection, "Information Received\r\n");  
            printf("Buffer: " . $buffer . "\r\n");  
        }  
        //关闭一个socket资源  
        socket_close($connection);  
        printf("Closed the socket\r\n\r\n");  
    }
    1. 2. 클라이언트

    기능:

    a. 클라이언트가 데이터를 읽습니다.


    b. 이것이 이 루프에 처음으로 도달하는 첫 번째 연결인 경우 서버는 클라이언트에 "NO DATA"를 다시 보냅니다. 이런 일이 발생하면 클라이언트가 연결의 최상위에 있습니다.

    c. 클라이언트는 데이터를 서버로 보내고, 데이터는 서버로 전송되며, 클라이언트는 응답을 기다립니다. 응답을 받으면 화면에 응답을 씁니다.

    소스 코드 보기, 클립보드에 복사 및 도움말 인쇄

    // 创建 socket  
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);  
      
    //链接 socket  
    $connection = socket_connect($socket,'localhost', 1337);  
      
    //读取指定长度的数据  
    while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) {  
        if($buffer == "NO DATA") {  
            printf("NO DATA");  
            break;  
        }else{  
            // 输出 buffer  
            printf("Buffer Data: " . $buffer . "");  
        }  
    }  
      
    printf("Writing to Socket");  
      
    //写数据到socket缓存  
    if(!socket_write($socket, "SOME DATA\r\n")){  
        printf("Write failed");  
    }  
      
    //读取指定长度的数据  
    while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)){  
        printf("Data sent was: SOME DATA Response was:" . $buffer . "");  
    }  
      
    printf("Done Reading from Socket");
    1. 관련 권장 사항:

    예제와 함께 PHP 소켓 프로그래밍에 대한 자세한 설명

    PHP에서 SOCKET 프로그래밍에 대한 자세한 설명

    PHP에서 소켓 통신에 대한 자세한 설명

위 내용은 PHP에서 소켓을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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