Socket是什么?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。一直以来很少看到有多少人使用PHP的socket模块来做一些事情,大概大家都把它定位在脚本语言的范畴内吧,但是其实php的socket模块可以做很多事情,包括做ftplist,http post提交,smtp提交,组包并进行特殊报文的交互(如smpp协议),whois查询。这些都是比较常见的查询。特别是php的socket扩展库可以做的事情简直不会比c差多少。
Socket基础
php使用Berkley的socket库来创建它的连接。可以知道socket只不过是一个数据结构。使用这个socket数据结构去开始一个客户端和服务器之间的会话。这个服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器,它就打开服务器正在进行监听的一个端口进行会话。这时,服务器端 接受客户端的连接请求,那么就进行一次循环。现在这个客户端就能够发送信息到服务器,服务器也能发送信息给客户端。
产生一个Socket,需要三个变量:一个协议、一个socket类型和一个公共协议类型。而产生一个socket有三种协议供选择,继续看下面的内容来获取详细的协议内容。定义一个公共的协议类型是进行连接一个必不可少的元素。下面让我们来看看这些公共的协议类型。
1. 协议
名字/常量 | 描述 |
AF_INET | 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用在IPv4的地址 |
AF_INET6 | 与上面类似,不过是来用在IPv6的地址 |
AF_UNIX | 本地协议,使用在Unix和Linux系统上,它很少使用,一般都是当客户端和服务器在同一台及其上的时候使用 |
2. Socket类型
名字/常量 | 描述 |
SOCK_STREAM | 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。 |
SOCK_DGRAM | 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。 |
SOCK_SEQPACKET | 这个协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。 |
SOCK_RAW | 这个socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议) |
SOCK_RDM | 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包的顺序 |
3. 公共协议
名字/常量 | 描述 |
ICMP | 互联网控制消息协议,主要使用在网关和主机上,用来检查网络状况和报告错误信息 |
UDP | 用户数据报文协议,它是一个无连接,不可靠的传输协议 |
TCP | 传输控制协议,这是一个使用最多的可靠的公共协议,它能保证数据包能够到达接受者那儿,如果在传输过程中发生错误,那么它将重新发送出错数据包。 |
知道了产生一个socket的三个元素,那么我们就在php中使用socket_create()函数来产生一个socket。这个 socket_create()函数需要三个参数:一个协议、一个socket类型、一个公共协议。socket_create()函数运行成功返回一个 包含socket的资源类型,如果没有成功则返回false。
Resourece socket_create(int protocol, int socketType, int commonProtocol);
php提供了几个操纵socket的函数,能够绑定socket到一个IP,监听一个socket的通信,接受一个socket;现在我们来看一个例子,了解函数是如何产生、接受和监听一个socket。
其代码如下所示:
<?php $commonProtocol = getprotobyname("tcp"); $socket = socket_create(AF_INET, SOCK_STREAM,$commonProtocol); socket_bind($socket,'localhost',1337); socket_listen($socket); ?>
说明:上面这个例子产生一个你自己的服务器端。
例子第一行,使用公共协议名字来获取一个协议类型。在这里使用的是TCP公共协议,如果你想使用UDP或者ICMP协议,那么你应该把getprotobyname() 函数的参数改为“udp”或“icmp”。还有一个可选的办法是不使用getprotobyname()函数而是指定SOL_TCP或SOL_UDP在 socket_create()函数中。
例子的第二行是产生一个socket并且返回一个socket资源的实例。在你有了一个socket资源的实例以后,你就必须把socket绑定到一个IP地址和某一个端口上。
第三行这里绑定socket到本地计算机(127.0.0.1)和绑定socket到你的1337端口。然后你就需要监听所有进来的socket连接。在第四行以后,你就需要了解所有的socket函数和他们的使用。socket函数会在后面的章节中详细说明。
【相关教程推荐】
Atas ialah kandungan terperinci php中的socket是什么?socket实例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!