PHP Socket编程

本文介绍了如何使用PHP的Socket库创建服务器与客户端之间的连接。详细解释了Socket的基本概念,包括协议、Socket类型及公共协议的选择,并给出了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PHP使用Berkley的socket库来创建它的连接。socket是一个数据结构。使用这个socket数据结构去开始一个客户端和服务器之间的会话。这个服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器,它就打开服务器正在进行监听的一个端口进行会话。这时,服务器端接受客户端的连接请求,那么就进行一次循环。现在这个客户端就能够发送信息到服务器,服务器也能发送信息给客户端。
产生一个Socket,需要三个变量:一个协议、一个socket类型和一个公共协议类型。
产生一个socket有三种协议供选择,继续看下面的内容来获取详细的协议内容。
定义一个公共的协议类型是进行连接一个必不可少的元素。下面介绍有哪些公共协议类型。

协议
名字/常量          描述
AF_INET          这是大多数用来产生socket的协议,使用TCP或UDP来传输,用在IPv4的地址
AF_INET6         与上面类似,不过是来用在IPv6的地址
AF_UNIX          本地协议,使用在Unix和Linux系统上,它很少使用,一般都是当客户端和服务器在同一台及其上的时候使用

Socket类型
名字/常量          描述
SOCK_STREAM      这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。
SOCK_DGRAM       这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。
SOCK_SEQPACKET   这个协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。
SOCK_RAW         这个socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)
SOCK_RDM         这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包的顺序

公共协议
名字/常量          描述
icmp             互联网控制消息协议,主要使用在网关和主机上,用来检查网络状况和报告错误信息
udp              用户数据报文协议,它是一个无连接,不可靠的传输协议
tcp              传输控制协议,这是一个使用最多的可靠的公共协议,它能保证数据包能够到达接收者,如果在传输过程中发生错误,那么它将重新发送出错数据包。

现在知道了产生一个socket的三个元素,那么就在php中使用socket_create()函数来产生一个socket。
这个socket_create()函数需要三个参数:一个协议、一个socket类型、一个公共协议。
socket_create()函数运行成功返回一个包含socket的资源类型,如果没有成功则返回false。

resourece socket_create(int protocol, int socketType, int commonProtocol);

现在产生一个socket,php提供了几个操纵socket的函数。能够绑定socket到一个IP,监听一个socket的通信,接受一个socket等等。
现在我们来看一个例子,了解函数是如何产生、接受和监听一个socket。

上面这个例子产生服务器端。
$protocol = getprotobyname('tcp');
使用公共协议名字来获取一个协议类型。在这里使用的是TCP公共协议。
如果你想使用UDP或者ICMP协议,那么你应该把getprotobyname() 函数的参数改为"udp"或"icmp"。
还有一个可选的办法是不使用getprotobyname()函数而是指定SOL_TCP或SOL_UDP在socket_create()函数中。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
然后是产生一个socket并且返回一个socket资源的实例。
有了一个socket资源的实例以后,就必须把socket绑定到一个IP地址和某一个端口上。在这里绑定socket到本地计算机(127.0.0.1)和绑定socket到3000端口。
socket_bind($socket, 'localhost', 3000);
然后就需要监听所有进来的socket连接。
socket_listen($socket);
然后就可以向socket写数据,并从socket中读取客户端传过来的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值