Artikel ini membawakan anda pengetahuan yang berkaitan tentang php+socket. Ia terutamanya memperkenalkan apa itu soket? Bagaimanakah php+socket merealisasikan penghantaran data pelayan pelanggan? Rakan-rakan yang berminat boleh lihat di bawah ini semoga bermanfaat untuk semua.
Pengenalan soket
Untuk mencapai komunikasi antara proses rangkaian, hampir semua aplikasi menggunakan soket ialah komunikasi perantaraan antara lapisan aplikasi dan keluarga protokol TCP/IP. Lapisan abstraksi, iaitu satu set antara muka. Dalam mod reka bentuk, soket sebenarnya ialah mod fasad, yang menyembunyikan keluarga protokol TCP/IP yang kompleks di belakang antara muka soket Bagi pengguna, satu set antara muka mudah adalah semua, membolehkan soket mengatur data untuk mematuhi Protokol yang ditentukan.
Maksud asal soket dalam bahasa Inggeris ialah "lubang" atau "soket" dan digunakan untuk menerangkan alamat IP dan port Ia ialah pemegang rantai komunikasi boleh digunakan untuk melaksanakan komunikasi antara mesin maya yang berbeza atau komputer yang berbeza.
Tiga proses pautan soket
Pemantauan pelayan: IP + nombor port
Permintaan pelanggan: dikeluarkan kepada perkhidmatan Tamat Permintaan sambungan IP dan port
Pengesahan pautan: Apabila soket pelayan mendengar atau menerima permintaan sambungan soket klien, ia akan membuat proses baharu Hantar penerangan soket pelayan kepada klien sebagai tindak balas kepada permintaan pelanggan Setelah pelanggan mengesahkan perihalan ini, sambungan diwujudkan. Soket pelayan terus berada dalam keadaan mendengar dan terus menerima permintaan sambungan daripada soket klien lain.
Jika anda perlu menggunakan soket dalam php, anda perlu menambah--enable-sockets
item konfigurasi apabila menyusun php Untuk mendayakannya, anda boleh menggunakan perintahphp -m|grep sockets
untuk menyemak status pembolehan Untuk proses penyusunan khusus, sila rujuk artikel ini
Pengalaman pantasSisi pelayan dan Kod ringkas klien adalah seperti berikut Selepas dijalankan, pelayan akan menyekat dan menunggu klien untuk menyambungkan kandungan input pada konsol dicetak pada pelayan Pada masa yang sama, klien akan memaparkan kandungan yang ditukar kepada huruf besar Pelayan contoh ini Berjalan pada pelayan yang sama dengan klien:
Mendengarkan pelayan<.>
Sambungan pelangganSalin selepas log masuk
Penjelasan sintaks
Salin selepas log masuk
socket_create
Buat dan kembalikan sumber soket, biasanya juga dipanggil nod komunikasi. Soket biasa terdiri daripada sekurang-kurangnya 2 soket, satu berjalan di bahagian klien dan satu berjalan di bahagian pelayan.
socket_create(int $domain,int $type, int $protocol): resource|false
domain
Domain | 描述 |
---|---|
AF_INET | IPv4 网络协议,TCP 与 UDP 都可使用此协议 |
AF_INET6 | IPv6 网络协议,TCP 与 UDP 都可使用此协议 |
AF_UNIX | 本地通讯协议,具有高性能与低成本的 IPC |
type
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视频教程》
Atas ialah kandungan terperinci Siri PHP+Socket merealisasikan penghantaran data antara klien dan pelayan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!