数码资讯
PHP套接字的解释与案例分析
在这一章中,您将了解到迷人的、容易混淆的套接字。套接字是PHP中未充分利用的函数。今天,您将看到一个可以使用客户端连接的服务器可以通过套接字在客户端生成和连接。服务器端将向客户端发送详细的处理信息。 当您看到完整的套接字进程时,您将在将来的程序开发中使用它。客户端是一个Web浏览器,它是一个单一的客
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
在这一章中,您将了解到迷人的、容易混淆的套接字。套接字是PHP中未充分利用的函数。今天,您将看到一个可以使用客户端连接的服务器可以通过套接字在客户端生成和连接。服务器端将向客户端发送详细的处理信息。
当您看到完整的套接字进程时,您将在将来的程序开发中使用它。客户端是一个Web浏览器,它是一个单一的客户机/服务器关系。
插座的基础
PHP使用Berkley的socket库来创建连接,你可以知道插座是一种数据结构,你用这个套接字数据结构开始在客户端和服务器之间的会话,服务器总是听准备一个新的会话。当一个客户端连接到一个服务器,它会打开一个上一个端口,服务器监听会话。在这一点上,服务器接收来自客户端的连接请求,然后循环进行。现在客户可以将信息发送到服务器,服务器可以发送信息到客户端。
要生成套接字,需要三个变量:一个协议、一个套接字类型和一个公共协议类型。套接字有三个协议供选择,并继续查看以下内容以获得详细的协议内容。
定义公共协议类型是连接的一个基本元素。
表1:协定
名称常量描述
af_inet这是大多数用来生成socket协议,通过TCP或UDP用于IPv4地址
af_inet6上面的类似,但它是用来在IPv6地址
af_unix本地协议,用于UNIX和Linux系统,是很少使用,通常用于当客户机和服务器上使用相同的平台,在同一平台。
表二:套接字类型
名称常量描述
的sock_stream协议是一个连续的、可靠的、完整的字节码数据的连接。这是最常用的套接字类型,这个插座使用TCP传输。
的sock_dgram协议是无连接的,固定长度的呼叫转移,协议是不可靠和使用UDP连接。
的sock_seqpacket协议是一种双行,可靠的连接,发送一个固定长度的数据包传输。这个包完全接受,必须读。
sock_raw这个套接字类型提供了一个单一的网络接入,和插座类型使用公共ICMP协议。(ping,traceroute使用协议)
这种类型的sock_rdm很少使用。它在大多数操作系统上没有实现。它被提供给数据链路层,并且不保证数据包的顺序。
表三:公共协议
名称常量描述
ICMP因特网控制报文协议,主要用于网关和主机上检查网络状况并报告错误信息。
UDP用户数据报文协议,是一种无连接、不可靠的传输协议。
TCP传输控制协议是应用最广泛的可靠的公共协议,可以保证数据包能够到达接收方。如果传输过程中有错误,它将再次发送错误的数据包。
现在你知道插座的三个元素,然后用socket_create()函数在PHP中产生一个插座。这socket_create()函数需要三个参数:一个协议,套接字类型,和一个共同的协议,socket_create()如果没有成功函数运行成功返回一个包含插座资源类型和返回false。
资源socket_create(国际协议,国际sockettype,int commonprotocol);
现在,你生成一个套接字,然后呢PHP提供了几个函数来处理套接字,您可以将套接字绑定到IP,监听套接字的通信并接受套接字。现在让我们举一个例子来了解函数是如何生成、接受和监听套接字的。
复制代码代码如下所示:
< PHP
commonprotocol美元=它(TCP);
$插座= socket_create(af_inet,sock_stream,commonprotocol美元);
socket_bind($插座,localhost,1337);
Socket_listen ($socket);
套接字功能如下
>
上面的示例生成了自己的服务器端,
commonprotocol美元=它(TCP);
使用公共协议的名称获得协议类型。公共的TCP协议是用在这里,如果你想使用UDP和ICMP协议,你应该改变它的参数()函数对UDP和ICMP。另一个选择是在socket_create指定sol_tcp或sol_udp()代替使用它的功能()函数。
$插座= socket_create(af_inet,sock_stream,sol_tcp);
该示例的第二行是生成套接字并返回套接字资源的实例。在拥有套接字资源实例之后,必须将套接字绑定到IP地址和端口。
socket_bind($插座,localhost,1337);
在这里你将插座到本地计算机(127.0.0.1)和绑定socket到你的1337端口,那么你需要监控所有的套接字连接。
socket_listen(合穴);
在第四行之后,您需要知道所有的套接字函数及其使用。
表四:套接字函数
功能名称描述
socket_accept()接受一个插座连接
socket_bind()绑定套接字到IP地址和端口
socket_clear_error()清除插座或最后的错误代码错误
socket_close()关闭套接字资源
socket_connect()启动一个插座连接
socket_create_listen()打开一个套接字监听指定的端口的
socket_create_pair()产生一对难以区分的插座为数组
socket_create()产生一个插座,相当于一个数据结构,产生一个插座
socket_get_option()获取套接字选项
socket_getpeername()获取远程主机的IP地址
socket_getsockname()获取本地套接字的IP地址
socket_iovec_add()增加了一个新的载体,分散/聚集阵列
的socket_iovec_alloc()函数创建一个iovec数据结构,可以发送和接收的读写
socket_iovec_delete()删除一个已分配的iovec
socket_iovec_fetch()返回的数据到指定的iovec资源
socket_iovec_free()释放iovec资源
socket_iovec_set()设置的iovec数据新价值
socket_last_error()获取当前插座最后的错误代码
听socket_listen()从指定的套接字连接
socket_read()读取指定长度的数据
socket_readv()读取数据分散/聚集阵列
socket_recv()从插座两端的数据缓存
socket_recvfrom()接受数据从指定的套接字,如果没有指定,默认的电流插座
socket_recvmsg()接受消息从iovec
socket_select()的多路径选择
的socket_send()函数将数据发送到连接的套接字
socket_sendmsg()发送消息到插座
socket_sendto()发送一个消息到指定地址的插座
socket_set_block()设置在插座一块模式
socket_set_nonblock()套接字设置为非阻塞模式
socket_set_option()设置套接字选项
的socket_shutdown()函数允许你仔细阅读,写作,或指定的插座
socket_strerror()返回一个详细的指定错误号错误
socket_write()的数据写入到socket缓存
socket_writev()将数据写入一个分散/聚集阵列
(注:该函数介绍了删除原文的内容,详细说明了该函数的用法,参考原始英文文本,或参考PHP手册)。
以上所有功能都是关于PHP套接字的。如果使用这些函数,必须打开套接字。如果你还没有打开它,请编辑php.ini文件并删除以下行的注释。
php_sockets.dll延伸=
如果不能删除注释,请使用以下代码加载扩展库:
复制代码代码如下所示:
< PHP
如果(!extension_loaded('sockets '))
{
如果(strtoupper(substr(php_os,3))= =赢)
{
DL('php_sockets .dll);
}
其他的
{
DL('sockets。所以);
}
}
>
如果你不知道你的插座是开放的,那么你可以使用phpinfo()函数来确定是否插座是开着的。你知道插座打开看phpinfo信息如下:
看看phpinfo()信息插座
我有服务器
现在让我们完善第一个示例,您需要监视指定的套接字并处理用户的连接。
复制代码代码如下所示:
< PHP
commonprotocol美元=它(协议);
$插座= socket_create(af_inet,sock_stream,commonprotocol美元);
socket_bind($插座,'localhost ',1337);
socket_listen(合穴);
接受任何传入的连接到服务器
连接= socket_accept美元($插座);
如果(连接)
{
socket_write(合连接,你已经连接到插座…;
}
>
你应该用你的命令提示符运行这个例子,原因是,会有一个服务器,而不是一个网页。如果你尝试使用Web浏览器来运行脚本,它很可能会超过30秒的时间限制,你可以使用下面的代码建立一个无限运行时间,但它也推荐使用命令提示符运行。
(0)set_time_limit;
命令提示符中脚本的简单测试:
example01_server.php php.exe
如果你不设置在系统环境变量的PHP解释器的路径,你将需要指定您运行服务器的php.exe.when详细的路径,你可以通过远程登录连接到端口1337(telnet)测试服务器,如下:
服务器端有三个问题:
1。它不能接受多个连接。
2。它只完成一个命令。
三.不能通过Web浏览器连接服务器。
第一个问题比较容易。
为了解决这个问题,您可以每次都使用应用程序连接到服务器,但接下来的问题是您需要使用Web页面连接到服务器,这是很困难的。您可以让服务器接受连接,然后将一些数据发送给客户机(如果必须写),关闭连接并等待下一个连接。
在前面的代码的基础上,生成以下代码来执行新服务器。
复制代码代码如下所示:
< PHP
在我们的套接字上
commonprotocol美元=它(协议);
$插座= socket_create(af_inet,sock_stream,commonprotocol美元);
socket_bind($插座,'localhost ',1337);
socket_listen(合穴);
缓冲区初始化
缓冲区= 没有数据;
虽然(真实)
{
接受此套接字中的任何连接
连接= socket_accept美元($插座);
printf(插座连接 R;
检查缓冲区中是否有任何/任何东西。
如果(缓冲区)!
{
printf(在缓冲区的东西…发送数据…;
socket_write(合连接,为缓冲区。 );
printf(写给插座 R;
}
其他的
{
printf(没有数据缓冲区中的 R);
}
输入
而($data = socket_read(合连接,1024,php_normal_read))
{
缓冲区= $数据;
socket_write(合连接,收到的信息 R;
printf(缓冲。为缓冲区。 );
}
socket_close($连接);
printf(关闭插座 R;
}
>
您想在服务器端做什么它初始化一个插座,打开一个缓存接收和接收数据。等待连接,一旦产生一个连接,输出插座连接在服务器端的屏幕。这个服务器检查缓冲区,如果有在缓冲区的数据,将数据发送到计算机的连接然后它将信息传送到数据,一旦它接收信息,节省信息数据,并连接电脑了解信息,最后关闭连接。当连接被关闭时,服务器开始处理下一个连接。(翻译的,腐烂的重视原创)
这就是服务器所做的。它初始化套接字和
并发送数据。然后它等待连接。一旦,连接,它也被称为以下三个方面。
缓冲区中有任何东西;如果存在,则发送
在它发送数据之后,它等待接收信息。一旦它
它在数据中,让连接的计算机知道它有
然后关闭连接。连接关闭后,服务器启动。
过程中再次。
我有一个客户
处理第二个问题是很容易的,你需要生成一个PHP页面来连接一个套接字,将一些数据发送到它的缓存中并处理它,然后你有一个处理过的数据作为回报,你可以把你的数据发送给服务器,在另一个客户端连接中,它将处理这些数据。
解决第二个问题很容易。你需要创造
套接字,接收缓冲区中的任何数据,并处理
缓冲区中的数据可以将数据发送到服务器。
将处理您发送的数据,客户端将发送更多数据。
下面的示例演示了套接字的使用:
复制代码代码如下所示:
< PHP
套接字和连接创建
$插座= socket_create(af_inet,sock_stream,sol_tcp);
连接= socket_connect美元($插座,'localhost ',1337);
而($缓冲= socket_read($插座,1024,php_normal_read))
{
如果(缓冲区= =没有数据)
{
回波(无数据);
打破;
}
其他的
{
使用缓冲区中的数据做一些事情
缓冲区数据:。缓冲区);
}
}
回声(写入套接字);
将一些测试数据写入我们的套接字
如果(!socket_write($插座,一些数据 R))
{
回声(写入失败);
}
从套接字读取的任何响应
而($缓冲= socket_read($插座,1024,php_normal_read))
{
发送的数据是:一些数据响应是:。缓冲区;
}
回波(从套接字读取);
>
在这个例子中的代码演示了客户端连接到服务器,客户端读取数据。如果这是达到循环的第一个连接的第一时间,服务器将无数据发送回客户端。如果情况发生,客户在顶部的连接,客户端发送数据到服务器,将数据发送到服务器,与客户端等待响应。响应一旦被接受,它写到屏幕的响应。
当您看到完整的套接字进程时,您将在将来的程序开发中使用它。客户端是一个Web浏览器,它是一个单一的客户机/服务器关系。
插座的基础
PHP使用Berkley的socket库来创建连接,你可以知道插座是一种数据结构,你用这个套接字数据结构开始在客户端和服务器之间的会话,服务器总是听准备一个新的会话。当一个客户端连接到一个服务器,它会打开一个上一个端口,服务器监听会话。在这一点上,服务器接收来自客户端的连接请求,然后循环进行。现在客户可以将信息发送到服务器,服务器可以发送信息到客户端。
要生成套接字,需要三个变量:一个协议、一个套接字类型和一个公共协议类型。套接字有三个协议供选择,并继续查看以下内容以获得详细的协议内容。
定义公共协议类型是连接的一个基本元素。
表1:协定
名称常量描述
af_inet这是大多数用来生成socket协议,通过TCP或UDP用于IPv4地址
af_inet6上面的类似,但它是用来在IPv6地址
af_unix本地协议,用于UNIX和Linux系统,是很少使用,通常用于当客户机和服务器上使用相同的平台,在同一平台。
表二:套接字类型
名称常量描述
的sock_stream协议是一个连续的、可靠的、完整的字节码数据的连接。这是最常用的套接字类型,这个插座使用TCP传输。
的sock_dgram协议是无连接的,固定长度的呼叫转移,协议是不可靠和使用UDP连接。
的sock_seqpacket协议是一种双行,可靠的连接,发送一个固定长度的数据包传输。这个包完全接受,必须读。
sock_raw这个套接字类型提供了一个单一的网络接入,和插座类型使用公共ICMP协议。(ping,traceroute使用协议)
这种类型的sock_rdm很少使用。它在大多数操作系统上没有实现。它被提供给数据链路层,并且不保证数据包的顺序。
表三:公共协议
名称常量描述
ICMP因特网控制报文协议,主要用于网关和主机上检查网络状况并报告错误信息。
UDP用户数据报文协议,是一种无连接、不可靠的传输协议。
TCP传输控制协议是应用最广泛的可靠的公共协议,可以保证数据包能够到达接收方。如果传输过程中有错误,它将再次发送错误的数据包。
现在你知道插座的三个元素,然后用socket_create()函数在PHP中产生一个插座。这socket_create()函数需要三个参数:一个协议,套接字类型,和一个共同的协议,socket_create()如果没有成功函数运行成功返回一个包含插座资源类型和返回false。
资源socket_create(国际协议,国际sockettype,int commonprotocol);
现在,你生成一个套接字,然后呢PHP提供了几个函数来处理套接字,您可以将套接字绑定到IP,监听套接字的通信并接受套接字。现在让我们举一个例子来了解函数是如何生成、接受和监听套接字的。
复制代码代码如下所示:
< PHP
commonprotocol美元=它(TCP);
$插座= socket_create(af_inet,sock_stream,commonprotocol美元);
socket_bind($插座,localhost,1337);
Socket_listen ($socket);
套接字功能如下
>
上面的示例生成了自己的服务器端,
commonprotocol美元=它(TCP);
使用公共协议的名称获得协议类型。公共的TCP协议是用在这里,如果你想使用UDP和ICMP协议,你应该改变它的参数()函数对UDP和ICMP。另一个选择是在socket_create指定sol_tcp或sol_udp()代替使用它的功能()函数。
$插座= socket_create(af_inet,sock_stream,sol_tcp);
该示例的第二行是生成套接字并返回套接字资源的实例。在拥有套接字资源实例之后,必须将套接字绑定到IP地址和端口。
socket_bind($插座,localhost,1337);
在这里你将插座到本地计算机(127.0.0.1)和绑定socket到你的1337端口,那么你需要监控所有的套接字连接。
socket_listen(合穴);
在第四行之后,您需要知道所有的套接字函数及其使用。
表四:套接字函数
功能名称描述
socket_accept()接受一个插座连接
socket_bind()绑定套接字到IP地址和端口
socket_clear_error()清除插座或最后的错误代码错误
socket_close()关闭套接字资源
socket_connect()启动一个插座连接
socket_create_listen()打开一个套接字监听指定的端口的
socket_create_pair()产生一对难以区分的插座为数组
socket_create()产生一个插座,相当于一个数据结构,产生一个插座
socket_get_option()获取套接字选项
socket_getpeername()获取远程主机的IP地址
socket_getsockname()获取本地套接字的IP地址
socket_iovec_add()增加了一个新的载体,分散/聚集阵列
的socket_iovec_alloc()函数创建一个iovec数据结构,可以发送和接收的读写
socket_iovec_delete()删除一个已分配的iovec
socket_iovec_fetch()返回的数据到指定的iovec资源
socket_iovec_free()释放iovec资源
socket_iovec_set()设置的iovec数据新价值
socket_last_error()获取当前插座最后的错误代码
听socket_listen()从指定的套接字连接
socket_read()读取指定长度的数据
socket_readv()读取数据分散/聚集阵列
socket_recv()从插座两端的数据缓存
socket_recvfrom()接受数据从指定的套接字,如果没有指定,默认的电流插座
socket_recvmsg()接受消息从iovec
socket_select()的多路径选择
的socket_send()函数将数据发送到连接的套接字
socket_sendmsg()发送消息到插座
socket_sendto()发送一个消息到指定地址的插座
socket_set_block()设置在插座一块模式
socket_set_nonblock()套接字设置为非阻塞模式
socket_set_option()设置套接字选项
的socket_shutdown()函数允许你仔细阅读,写作,或指定的插座
socket_strerror()返回一个详细的指定错误号错误
socket_write()的数据写入到socket缓存
socket_writev()将数据写入一个分散/聚集阵列
(注:该函数介绍了删除原文的内容,详细说明了该函数的用法,参考原始英文文本,或参考PHP手册)。
以上所有功能都是关于PHP套接字的。如果使用这些函数,必须打开套接字。如果你还没有打开它,请编辑php.ini文件并删除以下行的注释。
php_sockets.dll延伸=
如果不能删除注释,请使用以下代码加载扩展库:
复制代码代码如下所示:
< PHP
如果(!extension_loaded('sockets '))
{
如果(strtoupper(substr(php_os,3))= =赢)
{
DL('php_sockets .dll);
}
其他的
{
DL('sockets。所以);
}
}
>
如果你不知道你的插座是开放的,那么你可以使用phpinfo()函数来确定是否插座是开着的。你知道插座打开看phpinfo信息如下:
看看phpinfo()信息插座
我有服务器
现在让我们完善第一个示例,您需要监视指定的套接字并处理用户的连接。
复制代码代码如下所示:
< PHP
commonprotocol美元=它(协议);
$插座= socket_create(af_inet,sock_stream,commonprotocol美元);
socket_bind($插座,'localhost ',1337);
socket_listen(合穴);
接受任何传入的连接到服务器
连接= socket_accept美元($插座);
如果(连接)
{
socket_write(合连接,你已经连接到插座…;
}
>
你应该用你的命令提示符运行这个例子,原因是,会有一个服务器,而不是一个网页。如果你尝试使用Web浏览器来运行脚本,它很可能会超过30秒的时间限制,你可以使用下面的代码建立一个无限运行时间,但它也推荐使用命令提示符运行。
(0)set_time_limit;
命令提示符中脚本的简单测试:
example01_server.php php.exe
如果你不设置在系统环境变量的PHP解释器的路径,你将需要指定您运行服务器的php.exe.when详细的路径,你可以通过远程登录连接到端口1337(telnet)测试服务器,如下:
服务器端有三个问题:
1。它不能接受多个连接。
2。它只完成一个命令。
三.不能通过Web浏览器连接服务器。
第一个问题比较容易。
为了解决这个问题,您可以每次都使用应用程序连接到服务器,但接下来的问题是您需要使用Web页面连接到服务器,这是很困难的。您可以让服务器接受连接,然后将一些数据发送给客户机(如果必须写),关闭连接并等待下一个连接。
在前面的代码的基础上,生成以下代码来执行新服务器。
复制代码代码如下所示:
< PHP
在我们的套接字上
commonprotocol美元=它(协议);
$插座= socket_create(af_inet,sock_stream,commonprotocol美元);
socket_bind($插座,'localhost ',1337);
socket_listen(合穴);
缓冲区初始化
缓冲区= 没有数据;
虽然(真实)
{
接受此套接字中的任何连接
连接= socket_accept美元($插座);
printf(插座连接 R;
检查缓冲区中是否有任何/任何东西。
如果(缓冲区)!
{
printf(在缓冲区的东西…发送数据…;
socket_write(合连接,为缓冲区。 );
printf(写给插座 R;
}
其他的
{
printf(没有数据缓冲区中的 R);
}
输入
而($data = socket_read(合连接,1024,php_normal_read))
{
缓冲区= $数据;
socket_write(合连接,收到的信息 R;
printf(缓冲。为缓冲区。 );
}
socket_close($连接);
printf(关闭插座 R;
}
>
您想在服务器端做什么它初始化一个插座,打开一个缓存接收和接收数据。等待连接,一旦产生一个连接,输出插座连接在服务器端的屏幕。这个服务器检查缓冲区,如果有在缓冲区的数据,将数据发送到计算机的连接然后它将信息传送到数据,一旦它接收信息,节省信息数据,并连接电脑了解信息,最后关闭连接。当连接被关闭时,服务器开始处理下一个连接。(翻译的,腐烂的重视原创)
这就是服务器所做的。它初始化套接字和
并发送数据。然后它等待连接。一旦,连接,它也被称为以下三个方面。
缓冲区中有任何东西;如果存在,则发送
在它发送数据之后,它等待接收信息。一旦它
它在数据中,让连接的计算机知道它有
然后关闭连接。连接关闭后,服务器启动。
过程中再次。
我有一个客户
处理第二个问题是很容易的,你需要生成一个PHP页面来连接一个套接字,将一些数据发送到它的缓存中并处理它,然后你有一个处理过的数据作为回报,你可以把你的数据发送给服务器,在另一个客户端连接中,它将处理这些数据。
解决第二个问题很容易。你需要创造
套接字,接收缓冲区中的任何数据,并处理
缓冲区中的数据可以将数据发送到服务器。
将处理您发送的数据,客户端将发送更多数据。
下面的示例演示了套接字的使用:
复制代码代码如下所示:
< PHP
套接字和连接创建
$插座= socket_create(af_inet,sock_stream,sol_tcp);
连接= socket_connect美元($插座,'localhost ',1337);
而($缓冲= socket_read($插座,1024,php_normal_read))
{
如果(缓冲区= =没有数据)
{
回波(无数据);
打破;
}
其他的
{
使用缓冲区中的数据做一些事情
缓冲区数据:。缓冲区);
}
}
回声(写入套接字);
将一些测试数据写入我们的套接字
如果(!socket_write($插座,一些数据 R))
{
回声(写入失败);
}
从套接字读取的任何响应
而($缓冲= socket_read($插座,1024,php_normal_read))
{
发送的数据是:一些数据响应是:。缓冲区;
}
回波(从套接字读取);
>
在这个例子中的代码演示了客户端连接到服务器,客户端读取数据。如果这是达到循环的第一个连接的第一时间,服务器将无数据发送回客户端。如果情况发生,客户在顶部的连接,客户端发送数据到服务器,将数据发送到服务器,与客户端等待响应。响应一旦被接受,它写到屏幕的响应。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。