목차
php에서는 소켓을 구현합니다
백엔드 개발 PHP 튜토리얼 PHP+Socket 시리즈는 클라이언트와 서버 간의 데이터 전송을 구현합니다.

PHP+Socket 시리즈는 클라이언트와 서버 간의 데이터 전송을 구현합니다.

Feb 02, 2023 am 11:35 AM
php socket

이 글에서는 php+socket에 대한 관련 지식을 주로 소개합니다. php+socket은 클라이언트-서버 데이터 전송을 어떻게 실현합니까? 관심 있는 친구들은 아래를 살펴보시면 모두에게 도움이 되길 바랍니다.

소켓 소개

거의 모든 애플리케이션은 소켓을 사용합니다. 소켓은 애플리케이션 계층과 TCP/IP 프로토콜 제품군 간의 통신을 위한 중간 추상화 계층입니다. 디자인 모드에서 소켓은 실제로 소켓 인터페이스 뒤에 복잡한 TCP/IP 프로토콜 제품군을 숨기는 외관 모드입니다. 사용자의 경우 소켓이 지정된 데이터를 준수하도록 데이터를 구성할 수 있는 간단한 인터페이스 세트가 전부입니다. 프로토콜의 원래 영어 의미

PHP+Socket 시리즈는 클라이언트와 서버 간의 데이터 전송을 구현합니다.

socket은 "구멍" 또는 "소켓"이며, 종종 "소켓"이라고도 합니다. 이는 통신 체인에 대한 핸들이며 다음과 같은 용도로 사용할 수 있습니다. 가상 머신 또는 서로 다른 컴퓨터 간에 서로 다른 통신을 구현합니다.

소켓 링크의 3가지 프로세스

  • 서버 모니터링: IP + 포트 번호

  • 클라이언트 요청: 서버의 IP 및 포트에 연결 요청을 발행합니다.

  • 링크 확인: 서버 소켓 모니터링 클라이언트 소켓 연결 요청에 따라 그는 새로운 프로세스를 생성하고 클라이언트의 요청에 대한 응답으로 서버의 소켓 설명을 클라이언트에 보냅니다. 일단 클라이언트가 이 설명을 확인하면 연결이 완료됩니다. 서버의 소켓은 계속해서 수신 대기 상태에 있으며 다른 클라이언트 소켓의 연결 요청을 계속해서 받아들입니다.

PHP+Socket 시리즈는 클라이언트와 서버 간의 데이터 전송을 구현합니다.

php에서는 소켓을 구현합니다

PHP에서 소켓을 사용해야 하는 경우 PHP를 컴파일할 때 --enable-sockets 구성 항목을 추가하여 활성화해야 합니다. php -m|grep 소켓 명령을 사용하여 활성화 상태를 확인하세요. 구체적인 컴파일 프로세스는 본 글--enable-sockets 配置项来启用,可使用 php -m|grep sockets 命令检查启用情况,具体编译过程可参考 这篇文章

快速体验

服务端与客户端简略代码如下,运行后服务端会阻塞等待客户端连接,客户端会在控制台要求输入内容,输入后信息会在服务端打印,同时客户端显示转为大写的内容,此示例服务端与客户端运行在一台服务器:

服务端监听

<?php

// 创建套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 设置 ip 被释放后立即可使用
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true);

// 绑定ip与端口
socket_bind($socket, 0, 8888);

// 开始监听
socket_listen($socket);

while (true) {
    // 接收内容
    $conn_sock = socket_accept($socket);
    socket_getpeername($conn_sock, $ip, $port);
    // echo &#39;请求ip: &#39; . $ip . PHP_EOL . &#39;端口: &#39; . $port;

    while (true) {
        // 获取消息内容
        $msg = socket_read($conn_sock, 10240);
        // TODO 处理业务逻辑

        // 将信息转为大写并原样返回客户端
        socket_write($conn_sock, strtoupper($msg));

        echo $msg;
    }
}
로그인 후 복사

客户端连接

<?php

// 创建套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 连接服务端
socket_connect($socket, &#39;127.0.0.1&#39;, 8888);

while (true) {
    // 让控制台输入内容
    fwrite(STDOUT, &#39;请输入内容:&#39;);
    $in = fgets(STDIN);

    // 向服务端发送内容
    socket_write($socket, $in);

    // 读取服务端发送的消息
    $msg = socket_read($socket, 10240);
    echo $msg;
}
로그인 후 복사

语法解释

socket_create

socket_create(int $domain,int $type, int $protocol): resource|false
로그인 후 복사

创建并返回一个套接字资源,通常也称作一个通讯节点。一个典型的 socket 由至少 2 个套接字组成,其中一个运行在客户端,一个运行在服务端。

参数:

  • domain 指定当前套接字使用什么协议,可用协议如下:

    Domain描述
    AF_INETIPv4 网络协议,TCP 与 UDP 都可使用此协议
    AF_INET6IPv6 网络协议,TCP 与 UDP 都可使用此协议
    AF_UNIX本地通讯协议,具有高性能与低成本的 IPC
  • type

    빠른 체험서버와 클라이언트의 간단한 코드는 다음과 같습니다. 실행 후 서버는 차단하고 대기합니다. 클라이언트가 연결되면 클라이언트는 콘솔에 입력 내용을 요청합니다. 입력 후 정보가 서버에 인쇄되고 클라이언트는 내용을 대문자로 변환하여 표시합니다. 이 예제 서버와 클라이언트는 동일한 서버에서 실행됩니다.
    socket_bind(resource $socket, string $address [, int $port]): bool
    로그인 후 복사
    로그인 후 복사
    클라이언트 연결소켓 리소스를 생성하고 반환합니다. 일반적으로 통신 노드라고도 합니다. 일반적인 소켓은 최소 2개의 소켓으로 구성됩니다. 하나는 클라이언트 측에서 실행되고 다른 하나는 서버 측에서 실행됩니다. 매개변수: DescriptionAF_INET
    서버 수신
    socket_listen(resource $socket [, int $backlog]): bool
    로그인 후 복사
    로그인 후 복사
    구문 설명
    socket_create
    socket_accept(resource $socket): resource|false
    로그인 후 복사
    로그인 후 복사
      domain은 현재 소켓이 사용하는 프로토콜을 지정합니다. 사용 가능한 프로토콜은 다음과 같습니다.
      Domain
      IPv4 네트워크 프로토콜, TCP와 UDP 모두 이 프로토콜을 사용할 수 있습니다🎜🎜🎜🎜AF_INET6🎜🎜IPv6 네트워크 프로토콜, TCP와 UDP 모두 이 프로토콜을 사용할 수 있습니다.🎜🎜🎜🎜AF_UNIX🎜🎜로컬 통신 프로토콜, 고성능 및 저비용 IPC 🎜🎜🎜
      c Type 사용자 유형은 현재 제트 단어 🎜🎜🎜🎜🎜🎜Type🎜🎜 설명 🎜🎜🎜🎜🎜🎜Sock_stream🎜🎜의 유형을 지정합니다. 데이터 전송 흐름 제어 메커니즘을 지원하는 안정적인 전이중 링크 기반 바이트 스트림입니다. TCP 프로토콜은 이 스트리밍 소켓을 기반으로 합니다. 🎜🎜🎜🎜SOCK_DGRAM🎜🎜데이터 메시지 지원(연결 없음, 신뢰할 수 없음, 고정된 최대 길이) UDP 프로토콜은 이 메시지 소켓을 기반으로 합니다.🎜🎜🎜🎜SOCK_SEQPACKET🎜🎜순차적이고 신뢰할 수 있는 전체 이중 산업용, 연결 지향, 고정된 최대 길이 데이터 통신, 데이터 끝은 각 데이터 세그먼트를 수신하여 전체 데이터 패킷을 읽습니다. 🎜🎜🎜🎜SOCK_RAW🎜🎜원본 네트워크 프로토콜을 읽으십시오. 이 특수 소켓은 사용 가능합니다. 모든 유형의 프로토콜을 수동으로 구축하는 데 적합합니다. 이 소켓은 일반적으로 사용됩니다. ICMP 요청 구현🎜🎜🎜🎜SOCK_RDM🎜🎜신뢰할 수 있는 데이터 레이어이지만 도착 순서는 보장되지 않습니다. 일반 운영 체제에서는 이 기능을 구현하지 않습니다🎜🎜🎜🎜
  • protocol 设置指定 domain 套接字下的具体协议,如果所需协议是 TCP 或者 UDP,可以直接使用常量 SOL_TCPSOL_UDP,这个参数的具体值可通过 getprotobyname() 函数获取

  • 返回值

    socket_create() 正确时返回一个套接字资源,失败时返回 false。可以调用 socket_last_error() 获取错误码,错误码可以通过 socket_strerror(int $err_no) 转换为文字的错误说明。

    socket_bind

    socket_bind(resource $socket, string $address [, int $port]): bool
    로그인 후 복사
    로그인 후 복사

    绑定一个地址与端口到套接字

    参数:

    • socket 使用 socket_create() 创建的套接字资源

    • address

      如果套接字是 AF_INET 族,那么 address 必须是一个四点法的 IP 地址,例如 127.0.0.10.0.0.0

      如果套接字是 AF_UNIX 族,那么 address 是 Unix 套接字一部分(例如 /tmp/my.sock

    • port (可选)

      该参数仅用于使用 AF_INET 族时,指定当前套接字监听的端口号

    返回值:

    绑定成功返回 true,失败时则返回 false,同 socket_create ,在绑定失败时可以调用 socket_last_error() 获取错误码,错误码可以通过 socket_strerror(int $err_no) 转换为文字的错误说明。

    socket_listen

    socket_listen(resource $socket [, int $backlog]): bool
    로그인 후 복사
    로그인 후 복사

    在使用 socket_create() 创建套接字并使用 socket_bind() 将其绑定到名称之后,可能会告诉它侦听套接字上的传入连接。该函数仅适用于 SOCK_STREAMSOCK_SEQPACKET 类型的套接字。

    参数:

    • socket 使用 socket_create() 创建的套接字资源
    • backlog 最大数量的积压传入连接将排队等待处理,如果连接请求到达时队列已满,则客户端可能会收到指示为 ECONNREFUSED 的错误。或者,如果底层协议支持重传,则可能会忽略该请求,以便重试可能会成功。

    返回值:

    绑定成功返回 true,失败时则返回 false,可以调用 socket_last_error() 获取错误码,错误码可以通过 socket_strerror(int $err_no) 转换为文字的错误说明。

    socket_accept

    socket_accept(resource $socket): resource|false
    로그인 후 복사
    로그인 후 복사

    当有新的客户端连接时,返回一个新的 socket 资源以用于与客户端通信,如有多个连接排队,则返回第一个连接,相反如果没有待处理的连接,该函数会默认阻塞当前进程,直至新的客户端连接、断开

    参数:

    • socket 使用 socket_create() 创建的套接字资源

    返回值:

    成功时返回一个新的套接字资源,错误时返回 false,可以调用 socket_last_error() 获取错误码,错误码可以通过 socket_strerror(int $err_no) 转换为文字的错误说明。

    socket_connect

    socket_connect(resource $socket, string $address [, int $port = null]): bool
    로그인 후 복사

    使用套接字实例发起到 address 的连接

    参数:

    • socket 该参数必须是由 socket_create() 创建的 socket 实例

    • address

      如果套接字是 AF_INET 族,那么 address 必须是一个四点法的 IP 地址,例如 127.0.0.1 如果支持 IPv6 并且套接字是 AF_INET6,那么 address 也可以是一个有效的 IPv6 地址(例如 ::1

      如果套接字是 AF_UNIX 族,那么 address 是 Unix 套接字一部分(例如 /tmp/my.sock

    返回值:

    成功时返回 true, 或者在失败时返回 false

    socket_write

    socket_write(resource $socket, string $data [, int $length = null]): int|false
    로그인 후 복사

    传输数据至指定套接字

    参数:

    • socket 使用 socket_create()socket_accept() 创建的套接字资源

    • data 要发送的内容

    • length (可选)

      可以指定发送套接字的替代字节长度。如果这个长度大于实际发送内容的长度,它将被静默地截断为实际发送内容的长度。

    返回值:

    成功时返回成功发送的字节数,或者在失败时返回 false,可以调用 socket_last_error()socket_strerror(int $err_no) 获取具体错误信息

    socket_read

    socket_read(resource $socket, int $length, int $mode = PHP_BINARY_READ): string|false
    로그인 후 복사

    从套接字资源内读取数据

    参数:

    • socket 使用 socket_create()socket_accept() 创建的套接字资源(服务端为 socket_accept() 客户端为 socket_create()

    • length 指定最大能够读取的字节数。否则您可以使用 \r\n\0 结束读取(根据 mode 参数设置)

    • mode (可选)

      PHP_BINARY_READ (默认)- 使用系统的 recv() 函数。二进制安全地读取数据。

      PHP_NORMAL_READ - 读取到 \n\r 时停止。

    返回值:

    socket_read() 返回一个字符串,表示接收到的数据。如果发生了错误(包括远程主机关闭了连接),则返回 false,可以调用 socket_last_error()socket_strerror(int $err_no) 获取具体错误信息

    socket_close

    socket_close(resource $socket): void
    로그인 후 복사

    关闭并销毁一个套接字资源

    参数:

    • socket 使用 socket_create()socket_accept() 创建的套接字资源

    返回值:

    推荐学习:《PHP视频教程》                                                    

    위 내용은 PHP+Socket 시리즈는 클라이언트와 서버 간의 데이터 전송을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
    4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    메모장++7.3.1

    메모장++7.3.1

    사용하기 쉬운 무료 코드 편집기

    SublimeText3 중국어 버전

    SublimeText3 중국어 버전

    중국어 버전, 사용하기 매우 쉽습니다.

    스튜디오 13.0.1 보내기

    스튜디오 13.0.1 보내기

    강력한 PHP 통합 개발 환경

    드림위버 CS6

    드림위버 CS6

    시각적 웹 개발 도구

    SublimeText3 Mac 버전

    SublimeText3 Mac 버전

    신 수준의 코드 편집 소프트웨어(SublimeText3)

    Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

    PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

    CakePHP 날짜 및 시간 CakePHP 날짜 및 시간 Sep 10, 2024 pm 05:27 PM

    cakephp4에서 날짜와 시간을 다루기 위해 사용 가능한 FrozenTime 클래스를 활용하겠습니다.

    CakePHP 토론 CakePHP 토론 Sep 10, 2024 pm 05:28 PM

    CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

    CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

    파일 업로드 작업을 위해 양식 도우미를 사용할 것입니다. 다음은 파일 업로드의 예입니다.

    PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

    VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

    CakePHP 빠른 가이드 CakePHP 빠른 가이드 Sep 10, 2024 pm 05:27 PM

    CakePHP는 오픈 소스 MVC 프레임워크입니다. 이를 통해 애플리케이션 개발, 배포 및 유지 관리가 훨씬 쉬워집니다. CakePHP에는 가장 일반적인 작업의 과부하를 줄이기 위한 여러 라이브러리가 있습니다.

    PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? Feb 07, 2025 am 11:57 AM

    이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

    JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. Apr 05, 2025 am 12:04 AM

    JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

    See all articles