php中套接字编程的详细说明
php中的套接字编程很难理解。但是,只要我们理解了几个socket函数之间的关系以及它们所扮演的角色,应该不难理解。在我看来,socket编程其实就是建立一个网络服务的客户端和服务器,和mysql客户端和服务器是一样的。如果你只了解mysql客户端和服务器的全部,你应该能理解我下面要讲的内容。
关于socket编程涉及的网络协议,什么TCP,UDP,什么socket三次握手等等。这些网络协议在互联网上都有非常详细的解释。这里我就不多说了,就剪一个socket建立socket的流程图给大家看看:
这张图是我辛辛苦苦从别人那里偷来的,你一定要好好看看。同时,我也要对拿走我偷来的截图的作者表示感谢。很抱歉偷了你的图案,希望你不要太在意。我懒得画画(其实我对自己的画画技术不太自信,呵呵)。
套接字如何建立连接?如上所述,它的连接过程本质上与mysql客户端和服务器之间的连接相同。mysql和mysql的区别在于MySQL的服务器和客户端都是为我们编辑过的,所以我们只需要应用就可以了。然而,关键时刻已经到来。socket除了几十个socket函数之外,没有给我们提供任何东西。
言外之意就是socket编程要求我们创建服务器和客户端,也就是说` ` socket编程` ` ——要求我们创建一个类似mysql的服务器和客户端应用。
说到这里,我想问一下,你觉得这个插座头疼吗?它没有设置服务器或客户端供我们申请。我们必须应用套接字函数并创建我们自己的网络协议套接字应用程序。这让你头疼吗?我没办法。如果需要自己的应用,还是要处理socket。呵呵,这只是题外话,不多说,言归正传。
在你被socket编程弄糊涂之前,我先给你展示一下socket的几个关键功能,先给你解释一下它们各自的功能。否则,如果没有任何套接字编程基础的人看了,恐怕看完之后,你会果断跳过这篇文章,从此变得害怕socket。呵呵,多说一句。
插座1的主要功能:
Socket_create($net参数1,$流参数2,$协议参数3)
功能:创建一个socket socket,说白了就是一个网络数据流。
返回值:一个套接字,如果参数错误,则发出错误的警告
Php的在线手册说得更清楚:
Socket_create创建并返回一个套接字,也称为通信节点。典型的网络连接由两个套接字组成,一个在客户端,另一个在服务器端。
上面这句话是抄袭php在线手册的。看,这里的意思是不是和我上面反复提到的客户端和服务器完全一样?哈哈。
参数1是网络协议,
有哪些网络协议?它有以下三种选择:
AF_INET: IPv4网络协议。TCP和UDP都可以使用这个协议。你知道,我通常用这个。
Af _ inet6: IPv6网络协议。TCP和UDP都可以使用这个协议。
AF_UNIX:本地通信协议。高性能低成本的进程间通信。
参数2:套接字流,选项有:
SOCK _ STREAMSOCK _ DGRAMSOCK _ SEQPACKETSOCK _ RAWSOCK _ RDM .
这里只解释前两个:
SOCK_STREAMTCP协议套接字。
SOCK_DGRAMUDP协议套接字。
更多信息,请链接这里:http://php.net/manual/zh/function.socket-create.php
参数3:协议协议,选项有:
SOL_TCP:TCP: TCP协议。
SOL_UDP:UDP: UDP协议。
由此可以看出,socket_create函数的第二个参数和第三个参数实际上是相关的。
例如,如果您的第一个参数应用IPv4协议:AF_INET,那么第二个参数应用TCP套接字:SOCK_STREAM,
那么第三个参数一定要用SOL_TCP,应该不难理解。
当然,TCP套接字只能使用TCP协议,对吗?如果应用UDP套接字,我就不说第三个参数怎么选了,呵呵,你懂的。
关键功能2:
Socket_connect($socket参数1,$ip参数2,$端口参数3)
函数:连接一个套接字,返回值为真或假
参数1:函数返回值1:socket_create
参数2: IP地址
参数3:端口号
关键功能3:
Socket_bind($socket参数1,$ip参数2,$端口参数3)
函数:绑定一个套接字,返回值为真或假
参数1:函数返回值1:socket_create
参数2: IP地址
参数3:端口号
关键功能4:
Socket_listen($socket参数1,$backlog参数2)
函数:听一个套接字并返回真或假
参数1:函数返回值1:socket_create
参数2:监听套接字的最大数量
关键功能5:
socket_accept($socket)
功能:接收套接字的资源信息,成功返回套接字的信息资源,但失败为假
参数:socket_create的函数返回值
关键功能6:
Socket_read($socket参数1,$length参数2)
功能:读取套接字的资源信息,
返回值:套接字资源成功转换为字符串信息,失败为假
参数1:函数返回值1:socket_create或socket_accept
参数2:读取字符串的长度
关键功能7:
Socket_write($socket参数1,$msg参数2,$strlen参数3)
功能:将数据写入套接字
返回值:成功返回字符串的字节长度,失败为假
参数1:函数返回值1:socket_create或socket_accept
参数2:字符串
参数3:字符串长度
关键功能8:
socket_close($socket)
功能:关闭插座
返回值:成功返回真,失败返回假
参数:socket_create或socket_accept的函数返回值
这八个功能是socket的核心功能。这里有两个更重要的功能
Socket_last_error($socket),参数是socket_create的返回值,用于获取套接字的最后一个错误代码号,并返回值socket code
Socket_strerror($code),参数是Socket_last_error函数的返回值,获取代码的字符串信息,返回值是socket的错误信息
这两个函数在套接字编程中仍然非常重要。写socket编程的时候,我觉得还是要用的,特别是初学者,可以当调试用
下面是代码,注意,请仔细看我的笔记,笔记很重要,笔记很重要,笔记很重要,重要的事情要喊三遍,呵呵。
服务器脚本,d : \ vhost \ test \ socket \ server _ socket.php。
?Php//创建服务器的socket socket流,net协议为IPv4,协议协议为TCP $ socket=socket _ create(af _ inet,sock _ stream,sol _ TCP);/*绑定接收到的套接字流主机和端口,对应客户端*/if (socket _ bind ($ socket,' 127.0.0.1 ',8888)==false) {echo的服务器绑定失败: '。socket _ stress(socket _ last _ error())/*这里的127.0.0.1是在本地主机上测试的。如果您有多台计算机,您可以写入IP地址*/}//并在以下情况下侦听套接字流(socket _ listen ($ socket,4)==false){ echo ' server listen fail : '。socket _ strerror(socket _ last _ }//让服务器无限获取客户端发送的信息做{ /*接收客户端发送的信息*/$ accept _ resource=socket _ accept($ socket);/*socket_accept的作用是接受socket _ bind()*/if($ accept _ resource!==false){ /*读取客户端发送的资源并将其转换为字符串*/$ string=socket _ read($ accept _ resource,1024);/*socket_read的作用是读取socket_accept()的资源,并将其转换为字符串*/echo' server receive为: '。$ string.php _ eol;//php_EOL是一个预定义的常量if($string!=false){ $return_client='服务器接收为: '。$string。PHP _ EOL/*将信息写入socket_accept的socket流,即把信息回馈给socket _ bind()*/socket _ Write($ accept _ resource,$ return _ client,strlen($ return _ client));/*socket_write用于将信息写入socket_create或socket_accept。*/}else{ echo 'socket_read为fail ';}/* socket _ close的作用是关闭socket_create()或socket _ accept()*/socket _ close($ accept _ resource)建立的套接字流;} } while(true);socket _ close($ socket);提示:请注意以上三个函数socket _ bind、socket _ listen、socket _ accept的执行顺序是不能改变的,即,
您必须首先执行socket_bind,然后执行socket_listen,最后执行socket_accept
客户端脚本,d : \ vhost \ test \ socket \ client _ socket.php。
?Php //创建套接字套接字流$ socket=socket _ create (af _ inet,sock _ stream,sol _ TCP);/* * * *//发送套接字流的最大超时为6秒socket _ set _ option ($ socket,sol _ socket,so _ sndtimeo,array ('sec'=6,' usec '=0));/* * * * * * * * * * * *设置套接字连接选项。您可以省略* * * * * * * * * * *//来连接服务器端的套接字流。如果(socket _ connect ($ socket,' 127)8888)==false){ echo ' connect fail masse ge : ',则此步骤将在客户端和服务器之间建立联系。socket _ strerror(socket _ last _ error());}else{ $message='我爱你我爱你socket ';//转换成GBK编码来处理乱码,这要看你的编码情况。每个人的编码都不一样$ message=MB _ convert _ encoding($ message,' GBK ',' UTF-8 ');//写入字符串信息if (socket _ write ($ socket,$ message,strlen ($ message))==false) {echo '未能写入'。socket _ strerror(socket _ last _ error())连接到服务器;}else{ echo '客户端写入成功'。PHP _ EOL//读取套接字流信息,同时($ callback=socket _ read ($ socket,1024)) {echo '服务器返回消息为: '。PHP _ eol。$回调;} } } socket _ close($ socket);//工作完成后,如何通过关闭套接字流来测试这两个脚本?
打开windows的dos窗口,也就是cmd黑窗口,然后运行phpd : \ vhost \ test \ socket \ server _ socket . PHP,
让服务器的黑色窗口持续运行,
其次,php的客户端脚本可以通过浏览器运行,也可以在cmd黑窗口中运行
PHP d : \ vhost \ test \ socket \ client _ socket . PHP
请注意:php,运行名,必须添加到windows的环境变量中。如果你不知道怎么加,
请输入php运行命令目录,使用绝对命令运行,或者百度可以将php命令添加到环境变量中
这是我的情况。你的文件地址可能和我的不同。请按您的地址操作,否则风险自负,呵呵
如上所述,套接字编程必须有一个服务器进行通信,因此服务器的黑色窗口必须保持打开。
添加了附言:
Socket_set_option($socket参数1,$level参数2,$optname参数3,$optval参数4)
这个函数用来为套接字设置数据流选项,也是一个重要的函数。
参数1:函数返回值1:socket_create或socket_accept
参数2: sol _ socket,这似乎是唯一的选择
参数3与参数4相关联,
参数3可以是:so _ reusaiddroso _ rcvtimeo s0 _ sndtimeo
解释一下:
SO_REUSEADDR是让套接字端口一释放就被重用
如果参数3是这样,参数4可以是真或假
SO_RCVTIMEO是套接字接收资源的最大超时
SO_SNDTIMEO是套接字发送资源的最大超时
如果参数3是这两个,那么参数4就是这样一个数组(' sec'=1,' usec'=500000)
超时的最长时间是在数组中设置的,但是一个以秒为单位,另一个以微秒为单位,两者具有相同的效果
版权声明:php中套接字编程的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。