相信大部分初中级的PHP程序员写业务代码的时候都是这样的。如果写累了,增删改查,何不体验一下网络编程的魅力。学习网络编程可以很好的了解一些底层的网络通信,比如Apache和Nginx是如何接受HTTP请求的,然后是如何与PHP进行交互的。为什么Nginx可以处理高并发请求?经常听到别人说同步IO、异步IO、阻塞IO、非阻塞IO……等等。相信大家学习网络编程后,一定会对它有深刻的理解。当然,本文只是对socket编程的介绍,暂时不包括以上内容。应该有一些同学没有接触过网络编程。这里先介绍一下什么是网络编程。网络编程就是在程序中如何实现两台计算机之间的通信。网络编程最终会开发的大部分应用都是支持各种协议的服务器,比如http服务器、websocket服务器,或者基于自定义协议的服务。它本质上是基于套接字套接字。sockets内部已经实现了TCP通信机制,开发者只需要专注于编码。至于为什么叫socket,这里就不说了。在开始编码之前,先介绍一下TCP协议栈:上图摘自《TCP/IP网络编程》一书。TCP/IP协议栈的诞生源于一个问题:如何通过互联网完成数据的有效传输?于是,基于这个问题,硬件、系统、路由等各个领域的专家齐聚一堂,最终定义了多套大大小小的协议。我们要解释的TCP/IP协议是在传输层。下图是TCP协议在数据传输方面的简单示意图:上图中,当主机A向主机B发送数据时,主机A必须收到主机B返回的确认报文,才能发送下一个数据包。从上图不难看出,TCP协议的最终目的是保证数据传输的有效性。对于初学者,我们暂时只需要记住上面的结论即可。下面主要介绍PHPsocket开发中要用到的一些标准函数及其用法,最后编写一个可以向客户端发送“hello,socket”的程序。创建一个监听本地端口的socket需要四步:1.创建一个socket2.给这个socket分配一个IP和端口号3.使这个socket转变为一个可接受的请求状态4.开始接受请求接下来介绍一下PHP完成这些步骤所需的函数:socket_create创建套接字socket_bind分配IP和端口socket_listen监听连接socket_accept接受连接socket_connect连接套接字socket_write将数据写入套接字socket_read从套接字中读取要获得以字节为单位的最大长度,我们只需要暂时知道这个函数是干什么的。至于详细的参数含义,你可以在完成下面的例子后去PHP官网查看。接下来就是最重要的编码环节了:下面的server.php是服务端的代码:代码解读:第一部分:创建socket,使用IPV4协议,至于参数的含义,相信大家已经明白了能力查阅文档:将socket绑定到本机的8899端口。第三:调用socket_listen开始监听该端口的请求。第四:开始接受连接请求。这里注意,如果没有收到请求,这个函数会一直阻塞在第五到第七处:向发送请求的客户端发送“hello,socket”字符串,最后注意关闭socket资源。我们运行这个文件:输入:phpserver.php回车后,我们会看到此时脚本已经进入阻塞状态:我们最基本的服务器程序到这里就已经完成了,可能有些朋友在这里会有疑问。上面第四位接受什么样的请求?那么接下来要写的客户端程序就是这个问题的最佳答案。客户端程序比较简单:分为两步:1.创建一个socket,用于向服务器指定端口发送请求2.通过调用连接函数向服务器发送连接请求下面开始client.php的编写:代码解释:第一:连接上面服务器程序监听的8899端口第二:接收服务器发来的“hello,socket”消息第三:输出接收到的字符接下来,我们先运行服务器:phpserver.php然后运行客户端:phpclient.php会看到如下结果:成功输出“hello,socket”字符串!相信大家看到这里已经对socket编程有了初步的了解。接下来介绍几个可以轻松完成上述操作的函数:对于上面的服务端程序,我们可以使用stream_socket_server函数来改写得更简洁。使用stream_socket_server函数,我们可以一次创建、绑定、监听三个步骤。以下是修改后的server_v2.php代码答案:第一:使用stream_socket_server一次性创建一个socket,绑定8899端口,开始监听。三个步骤。第二处:由于stream_socket_server函数创建的资源和socket_create创建的资源不同,所以这里使用的都是操作流资源的函数。关于phpSocket编程的介绍,这里先介绍一下。如有错误,欢迎在后台回复和指出。如果觉得这篇文章不错,可以关注我的公众号:阿毛的编码之路
