PHP Socket网络编程入门指南
什么是TCP/IP和UDP?
Tcp/IP(传输控制协议/互联网协议)是为广域网(wan)设计的工业标准协议集。UDP(用户数据协议)是与TCP相对应的协议。它属于TCP/IP协议家族之一。下面是显示这些协议之间关系的图表。
TCP/IP协议家族包括传输层、网络层和链路层。现在你知道TCP/IP和UDP的关系了。插座在哪里?在图1中,我们没有看到Socket的影子,那么它在哪里呢?或者用图片说话,一目了然。
原来Socket在这里。什么是Socket?Socket是介于应用层和TCP/IP协议族之间的中间软件抽象层,是一组接口。在设计模式中,Socket实际上是一个门面模式,它将复杂的TCP/IP协议家族隐藏在Socket接口的背后。对于用户来说,一组简单的接口就足够了,这样Socket就可以组织数据来满足指定的协议。你能用吗?前辈们为我们做了很多事情,网络之间的交流也简单了很多,但毕竟还有很多工作要做。之前听过Socket编程,以为是比较高深的编程知识,但只要了解了Socket编程的工作原理,神秘的面纱就会揭开。生活中的一幕。如果你想打电话给朋友,先拨。当朋友听到电话铃响时,他举起电话。这时,你和你的朋友已经建立了联系,可以说话了。交流结束后,挂断电话,结束对话。生活中的场景解释了这个工作原理。也许TCP/IP协议家族诞生在生活中,这不一定是真的。
php中socket编程概述php5.3自带socket模块,使得php具备Socket通信能力。具体api可以参考官方手册:http://php.net/manual/zh/function.socket-create.php.具体实现除了内存分配和网络字节顺序转换的底层操作之外,和C非常相似
同时,php的pcntl模块和posix模块可以实现进程管理、信号处理等基本的操作系统级功能。这里有两个关键函数,pcntl_fork()和posix_setsid()。Fork()是一个进程,这意味着创建一个正在运行的进程的副本,该副本被认为是一个子进程,而原始进程被认为是一个父进程。当fork()运行时,它可以与启动它的进程和终端控件分离,这意味着父进程可以自由退出。Pcntl_fork()返回值,-1表示执行失败,0表示在子进程中,大于0表示在父进程中。Setsit(),首先使新进程成为新会话的“领导者”,最后使进程不再控制终端。这也是成为守护进程最关键的一步,这意味着当终端关闭时,进程不会被迫退出。对于不会被中断的常驻流程来说,这是至关重要的一步。Fork()最后一次,这个步骤不是必须的,但是通常都会做,它最大的意义就是防止控制终端被获取
什么是守护进程?守护进程通常被认为是不控制终端的后台任务。它有三个明显的特点:
在后台运行并在没有终端控制的情况下启动他的进程是最常见的实现方法:fork()-setsid()-fork(),代码中的run_server()方法实现守护进程。
服务器套接字侦听代码
?php /接受客户端请求,回复固定的响应内容函数server_listen_socket ($address,$port) { $buffer='来自王正一服务器的味精,所以库比.$ len=strlen($ buffer);//创建、绑定和监听socket $ socket=socket _ create(AF _ INET、SOCK_STREAM、SOL _ TCP);if(!$socket) { echo '未能创建插座:socket_strerror($socket ).\ n ';exit();} $ bind _ flag=socket _ bind($ socket,$address,$ port);if(!$bind_flag) { echo '未能绑定插座:socket_strerror($bind_flag).\ n ';exit();} $ backlog=20 $ listen _ flag=socket _ listen($ socket,$ backlog);if(!$listen_flag) { echo '未能侦听插座:socket_strerror($listen_flag).\ n ';exit();}回声"等待客户端连接\ n ";while(1){ if($ accept _ socket=socket _ accept($ socket))==FALSE){ continue;} else { socket _ write($ accept _ socket,$buffer,$ len);socket _ close($ accept _ socket);} } }函数run _ server(){ $ PID 1=pcntl _ fork();if ($pid1==0) { //第一个子进程/守护进程的一般流程:fork()-setsid()-fork()-POSIX _ setsid();if(($ PID 2=pcntl _ fork())==0){ $ address=' 192。168 .1 .71 ';$ port=' 8767 server _ listen _ socket($ address,$ port);} else { //防止获得控制终端exit();} } else { //等待第一个子进程退出pcntl _ wait($ status);} } //服务器守护进程run _ server();运行效果启动服务器端窝进程,看是否在后台运行,效果如图:
客户端访问,可以通过浏览器或者卷曲访问,这里直接用卷曲访问了
版权声明:PHP Socket网络编程入门指南是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。