当前位置: 首页 > 后端技术 > PHP

PHP网络编程小白系列——Socket编程入门

时间:2023-03-29 15:36:21 PHP

本文将介绍PHP在Socket编程中的相关函数,简单实现一个C/S交互的Socket简介Socket官方讲解:网络编程中最重要的一个常用解决方案是Client/Server(客户端/服务器)模型。在这种情况下,客户端应用程序向服务器程序请求服务。服务程序通常在一个众所周知的地址监听服务请求,即服务进程一直处于休眠状态,直到客户端向该服务地址发出连接请求。此时,服务器程序“苏醒”并为客户端提供服务——适当地响应客户端的请求。为了方便这种Client/Server模型的网络编程,在20世纪90年代初,微软联合其他几家公司共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范。它不是一种网络协议,而是一种Windows下支持多种协议的开放式网络编程接口。现在的Winsock已经基本实现了和协议无关。可以使用Winsock来调用各种协议的功能,但TCP/IP协议更为常用。Socket实际上在计算机中提供了一个通信端口,可以通过这个端口与任何具有Socket接口的计算机进行通信。应用程序在网络上传输,接收信息就是通过这个Socket接口实现的。我们可以简单地将Socket理解为一个管道,可以连接网络上不同的计算机应用程序,从管道的A端抛出一堆数据,它将从管道的B端出现(也可以从C、D、E、F端出现)。注意:我们会在不同的上下文中用不同的词来修饰套接字,你只需要对它有一个概念,因为套接字本身并没有实体。Socket函数介绍了Socket通信。Socket创建、Socket绑定、Socket监听、Socket发送接收、Socket关闭几个阶段。下面我们列出PHP网络编程中最常用和必不可少的函数做进一步的说明。socket_createTODO:创建一个新的socket资源函数原型:resourcesocket_create(int$domain,int$type,int$protocol),包含三个参数,分别如下:domain:AF_INET,AF_INET6,AF_UNIX,AF的定义是addressfamily,地址族的意思,我们常用的ipv4,ipv6类型:SOCK_STREAM,SOCK_DGRAM等,最常用的是SOCK_STREAM,基于字节流的SOCKET类型,也是TCP协议协议使用的类型:SOL_TCP,SOL_UDP这个是具体使用的传输协议一般我们选择TCP进行可靠传输,游戏数据传输选择UDP协议。socket_bindTODO:将创建的socket资源绑定到特定的ip地址和端口函数原型:boolsocket_bind(resource$socket,string$address[,int$port=0])包含三个参数,分别如下:socket:socketsocket_create创建的资源,可以认为是socket对应的idaddress:ip地址port:监听的端口号,WEB服务器默认端口为80到地址下的socket资源:boolsocket_listen(resource$socket[,int$backlog=0])包含两个参数,分别如下:socket:socket_create创建的socket资源backlog:等待处理连接队列的最大值lengthofsocket_acceptTODO:监听后,接收一个即将到来的新连接,如果连接建立成功,会返回一个新的socket句柄(可以理解作为子进程,通常父进程用于接收新的连接,子进程负责具体通信)函数原型:resourcesocket_accept(resource$socket)socket:由socket_create创建的socket资源socket_writeeTODO:将指定数据发送到对应的socket管道函数原型:intsocket_write(resource$socket,string$buffer[,int$length])socket:使用socket_create创建的socket资源buffer:写入socket资源的数据length:控制写入socket资源的buffer的长度,如果长度大于buffer的容量,则取buffer的容量:usesocket_createThecreatedsocketresourcelength:socket资源中buffer的长度socket_closeTODO:关闭socket资源函数原型:voidsocket_close(resource$socket)socket:socket_accept或socket_create生成的资源不能用于关闭流resourcestream_socket_server由于创建了一个SOCKET进程,一直在进行socket、bind、listen,所以PHP提供了一个非常方便的函数to一次性创建、绑定端口和监听端口。函数原型:resourcestream_socket_server(string$local_socket[,int&$errno[,string&$errstr[,int$flags=STREAM_SERVER_BIND|STREAM_SERVER_LISTEN[,resource$context]]]])local_socket:协议名://地址:端口numbererrno:错误代码errstr:错误信息flags:onlyusepartofthisfunctioncontext:使用stream_context_create函数创建的资源流上下文套接字实现C/S交互。基于以上功能,我们可以很方便的搭建一个socket通信程序(这里希望读者可以单独创建一个目录如socket,因为我们以后会创建很多文件)先编辑一个服务器程序server.php,如下:连接到客户端*/set_time_limit(0);$ip='127.0.0.1';$端口=8090;/*+-------------------------------*@socket通信全过程+----------------------------*@socket_create*@socket_bind*@socket_listen*@socket_accept*@socket_read*@socket_write*@socket_close+--------------------------------*//*---------------以下操作都在手册里----------------*/if(($sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP))<0){echo"socket_create()为什么失败是:".socket_strerror($sock)."\n";}if(($ret=socket_bind($sock,$ip,$port))<0){echo"socket_bind()为什么失败是:".socket_strerror($ret)."\n";}if(($ret=socket_listen($sock,4))<0){echo"socket_listen()为什么失败是:".socket_strerror($ret)."\n";}echo"开始时间:".date('Y-m-dH:i:s').PHP_EOL;echo"正在收听".$ip.':'.$port.PHP_EOL;do{/*创建一个新连接*/if(($msgsock=socket_accept($sock))<0){echo"socket_accept()failed:reason:".socket_strerror($msgsock)."\n";休息;}else{#连接成功并输出Socketid$i=(int)$msgsock;echo"欢迎客户$i";#与客户端通信(反馈)$msg="连接成功!\n";socket_write($msgsock,$msg,strlen($msg));}socket_close($msgsock);}while(true);socket_close($sock);?>编辑另一个客户端程序client.php,如下:然后我们打开终端(命令行),进入文件目录执行:phpserver.phpphpclient.php运行效果如下:注意服务器监听时的过程它被挂起,不能执行其他操作。您可能需要启动另一个终端来执行客户端程序。Socket编程介绍结语本文是对PHPSocket编程中常用的函数进行整理并解释其含义,然后写一个简单的C/S交互,希望大家对网络编程有一个更直观的认识。下一篇我会简单说说进程在网络编程中的作用,这也为后面讲解网络模型打下基础。