PHP+Socket 시리즈는 클라이언트와 서버 간의 데이터 전송을 구현합니다.
이 글에서는 php+socket에 대한 관련 지식을 주로 소개합니다. php+socket은 클라이언트-서버 데이터 전송을 어떻게 실현합니까? 관심 있는 친구들은 아래를 살펴보시면 모두에게 도움이 되길 바랍니다.
소켓 소개
거의 모든 애플리케이션은 소켓을 사용합니다. 소켓은 애플리케이션 계층과 TCP/IP 프로토콜 제품군 간의 통신을 위한 중간 추상화 계층입니다. 디자인 모드에서 소켓은 실제로 소켓 인터페이스 뒤에 복잡한 TCP/IP 프로토콜 제품군을 숨기는 외관 모드입니다. 사용자의 경우 소켓이 지정된 데이터를 준수하도록 데이터를 구성할 수 있는 간단한 인터페이스 세트가 전부입니다. 프로토콜의 원래 영어 의미
socket은 "구멍" 또는 "소켓"이며, 종종 "소켓"이라고도 합니다. 이는 통신 체인에 대한 핸들이며 다음과 같은 용도로 사용할 수 있습니다. 가상 머신 또는 서로 다른 컴퓨터 간에 서로 다른 통신을 구현합니다.
소켓 링크의 3가지 프로세스
서버 모니터링: IP + 포트 번호
클라이언트 요청: 서버의 IP 및 포트에 연결 요청을 발행합니다.
링크 확인: 서버 소켓 모니터링 클라이언트 소켓 연결 요청에 따라 그는 새로운 프로세스를 생성하고 클라이언트의 요청에 대한 응답으로 서버의 소켓 설명을 클라이언트에 보냅니다. 일단 클라이언트가 이 설명을 확인하면 연결이 완료됩니다. 서버의 소켓은 계속해서 수신 대기 상태에 있으며 다른 클라이언트 소켓의 연결 요청을 계속해서 받아들입니다.
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 '请求ip: ' . $ip . PHP_EOL . '端口: ' . $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, '127.0.0.1', 8888); while (true) { // 让控制台输入内容 fwrite(STDOUT, '请输入内容:'); $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_INET IPv4 网络协议,TCP 与 UDP 都可使用此协议 AF_INET6 IPv6 网络协议,TCP 与 UDP 都可使用此协议 AF_UNIX 本地通讯协议,具有高性能与低成本的 IPC type
빠른 체험c
IPv4 네트워크 프로토콜, TCP와 UDP 모두 이 프로토콜을 사용할 수 있습니다🎜🎜🎜🎜AF_INET6🎜🎜IPv6 네트워크 프로토콜, TCP와 UDP 모두 이 프로토콜을 사용할 수 있습니다.🎜🎜🎜🎜AF_UNIX🎜🎜로컬 통신 프로토콜, 고성능 및 저비용 IPC 🎜🎜🎜서버와 클라이언트의 간단한 코드는 다음과 같습니다. 실행 후 서버는 차단하고 대기합니다. 클라이언트가 연결되면 클라이언트는 콘솔에 입력 내용을 요청합니다. 입력 후 정보가 서버에 인쇄되고 클라이언트는 내용을 대문자로 변환하여 표시합니다. 이 예제 서버와 클라이언트는 동일한 서버에서 실행됩니다. 서버 수신 클라이언트 연결socket_bind(resource $socket, string $address [, int $port]): bool
로그인 후 복사로그인 후 복사socket_listen(resource $socket [, int $backlog]): bool
로그인 후 복사로그인 후 복사구문 설명 socket_create 소켓 리소스를 생성하고 반환합니다. 일반적으로 통신 노드라고도 합니다. 일반적인 소켓은 최소 2개의 소켓으로 구성됩니다. 하나는 클라이언트 측에서 실행되고 다른 하나는 서버 측에서 실행됩니다.socket_accept(resource $socket): resource|false
로그인 후 복사로그인 후 복사매개변수: domain
은 현재 소켓이 사용하는 프로토콜을 지정합니다. 사용 가능한 프로토콜은 다음과 같습니다. DescriptionDomain AF_INETType
사용자 유형은 현재 제트 단어 🎜🎜🎜🎜🎜🎜Type🎜🎜 설명 🎜🎜🎜🎜🎜🎜Sock_stream🎜🎜의 유형을 지정합니다. 데이터 전송 흐름 제어 메커니즘을 지원하는 안정적인 전이중 링크 기반 바이트 스트림입니다. TCP 프로토콜은 이 스트리밍 소켓을 기반으로 합니다. 🎜🎜🎜🎜SOCK_DGRAM🎜🎜데이터 메시지 지원(연결 없음, 신뢰할 수 없음, 고정된 최대 길이) UDP 프로토콜은 이 메시지 소켓을 기반으로 합니다.🎜🎜🎜🎜SOCK_SEQPACKET🎜🎜순차적이고 신뢰할 수 있는 전체 이중 산업용, 연결 지향, 고정된 최대 길이 데이터 통신, 데이터 끝은 각 데이터 세그먼트를 수신하여 전체 데이터 패킷을 읽습니다. 🎜🎜🎜🎜SOCK_RAW🎜🎜원본 네트워크 프로토콜을 읽으십시오. 이 특수 소켓은 사용 가능합니다. 모든 유형의 프로토콜을 수동으로 구축하는 데 적합합니다. 이 소켓은 일반적으로 사용됩니다. ICMP 요청 구현🎜🎜🎜🎜SOCK_RDM🎜🎜신뢰할 수 있는 데이터 레이어이지만 도착 순서는 보장되지 않습니다. 일반 운영 체제에서는 이 기능을 구현하지 않습니다🎜🎜🎜🎜
protocol
设置指定 domain 套接字下的具体协议,如果所需协议是 TCP 或者 UDP,可以直接使用常量 SOL_TCP
或 SOL_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.1
、0.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_STREAM
或 SOCK_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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

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

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

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

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