下面根据本人日前的学习理解,现将PHP之Socket编程创建流程呈现如下。
Socket编程,实在便是建立一个网络做事的客户端和做事端,这和我们常常利用的MySQL客户端和做事端是一样的。如上图所示。首先,做事器建立socket套接字,绑定IP、端口,同时保持监听状态。然后,客户端创建Socket套接字,与做事器建立连接。
在先容详细的操作之前,我们先熟习几个与Socket编程干系的函数。
1、socket_create ( int $domain , int $type , int $protocol )
浸染:创建一个socket套接字,说白了,便是一个网络数据流。
返回值:一个套接字,或者是false,参数缺点发出E_WARNING警告
php的在线手册那里说得更清楚:socket_create创建并返回一个套接字,也称作一个通讯节点。一个范例的网络连接由 2 个套接字构成,一个运行在客户端,另一个运行在做事器端。
$domain表示网络协议,网络协议有哪些?它的选择项就下面这三个:
AF_INET:IPv4 网络协议。TCP 和 UDP 都可利用此协议。一样平常都用这个,你懂的。
AF_INET6:IPv6 网络协议。TCP 和 UDP 都可利用此协议。
AF_UNIX:本地通讯协议。具有高性能和低本钱的 IPC(进程间通讯)。
$type表示套接字流,选项有:
SOCK_STREAM
SOCK_DGRAM
SOCK_SEQPACKET
SOCK_RAWSOCK_RDM
这里只对前两个进行阐明:
SOCK_STREAMTCP 协议套接字。
SOCK_DGRAM UDP协议套接字。
欲理解更多请链接这里:http://php.net/manual/zh/function.socket-create.php
$protocol表示protocol协议,选项有:
SOL_TCP:TCP 协议。
SOL_UDP:UDP协议。
从这里可以看出,实在socket_create函数的第二个参数和第三个参数是干系联的。比如,如果你第一个参数运用IPv4协议:AF_INET,然后,第二个参数运用的是TCP套接字:SOCK_STREAM,那么第三个参数必须要用SOL_TCP,这个该当不难明得。TCP 协议套接字嘛,当然只能用TCP协议了,是不是?如果你运用UDP套接字,那么第三个参数该怎么选择我就不说了,呵呵,你懂的。
2、socket_bind ( resource $socket , string $address [, int $port = 0 ] )
浸染:绑定一个套接字,返回值为true或者false
$socket:socket_create的函数返回值
$address:ip地址
$port :端口号
3、socket_listen ( resource $socket [, int $backlog = 0 ] )
浸染:监听一个套接字,返回值为true或者false
$socket:socket_create的函数返回值
$backlog:最大监听套接字个数
4、socket_set_block ( resource $socket )
浸染:将socket_create创建的套接字设置为壅塞型。当一个操作(例如吸收,发送,连接,接管,...)在壅塞套接字上实行时,脚本会停息实行直到它吸收到一个旗子暗记或者它可以实行操作。
$socket:socket_create的函数返回值
5、socket_set_nonblock ( resource $socket )
浸染:将socket_create创建的套接字设置为非壅塞型。
$socket:socket_create的函数返回值
6、socket_accept ( resource $socket )
浸染:吸收套接字的资源信息,成功返回套接字的信息资源,失落败为false
$socket:socket_create的函数返回值
7、socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )
浸染:读取套接字的资源信息,
返回值:成功把套接字的资源转化为字符串信息,失落败为false
$socket:socket_create或者socket_accept的函数返回值
$length:读取的字符串的长度
8、socket_write ( resource $socket , string $buffer [, int $length = 0 ] )
浸染:把数据写入套接字中
返回值:成功返回字符串的字节长度,失落败为false
$socket:socket_create或者socket_accept的函数返回值
$buffer:字符串
$length:字符串的长度
9、socket_connect ( resource $socket , string $address [, int $port = 0 ] )
浸染:连接一个套接字,返回值为true或者false
$socket :socket_create的函数返回值
$address :ip地址
$port :端口号
10、socket_close ( resource $socket )
浸染:关闭套接字
返回值:成功返回true,失落败为false
$socket:socket_create或者socket_accept的函数返回值
下面来看看详细的实现。
做事端:server.php
客户端:client.php
以上代码只要在命令行实行,即可实现socket通讯。不过,这里要把稳的是,以上代码实行后,做事器端是壅塞的,即一个做事器,只许可一个客户端连接。
那如何实现一个做事器同时连接多个客户端呢?
要想实现一个做事器同时连接多个客户端,有如下几种方法:
采取壅塞模式,然后每当有一个客户端连上做事端,做事端就fork一个子进程,让子进程来实行读写操作。
采取非壅塞模式,然后每当有一个客户端连上做事端,就将此客户端连接放进一个数组中,末了,通过遍历数组中的连接来与每个客户端进行交互。
采取非壅塞模式,然后,利用epoll机制,来实现做事端与每个客户真个交互。
不才一篇文章中,我将重点先容。如果你想理解更多内容,可以关注本头条号。