1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 如何实现简单的php socket通信

如何实现简单的php socket通信

时间:2022-08-08 04:39:34

相关推荐

如何实现简单的php socket通信

后端开发|php教程

php,socket,通信

后端开发-php教程

金数据网站源码,远程帮助安装vscode,ubuntu mini下载,tomcat 日志大,sqlite 转化成db,大厂一般用什么前端框架,python社区版能爬虫吗,php代码扫描,苏州seo推广价位,产品销售网站源码,chrome网页错位,wordpress 商城模板lzw

元素p2p源码,vscode让文字滚动起来,ubuntu凤凰系统,tomcat自动生成内存堆栈,go异步爬虫,php用户管理后台,沙井seo优化服务商lzw

socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。socket既不是程序,也不是协议,其只是操作系统提供的通信层的一组抽象API。前面章节介绍了php socket的一些常用重要的函数,在socket通信中就会有使用。

动态表单源码下载,ubuntu使用详细步骤,tomcat漫画在线观看,如何限制爬虫,php应聘试题,渝中区服务型seo推广哪家好lzw

通信需要服务端和客户端组成:

服务端:使用php初始化socket然后绑定一个端口,对端口进行监听。调用accept阻塞,等待客户端连接。

客户端:客户端初始化一个socket,然后连接服务器,如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

客户端—服务端是可以彼此交互的应用程序。客户端和服务端之间的交互需要连接。Socket编程负责的就是为应用程序之间建立可进行交互的连接。

Socket连接过程

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

socket原理可以参考下面的流程图:

下面通过一个服务端–客户端的代码实例来简单实现一下socket通信整个过程

1. 其服务端代码:

<?phpset_time_limit(0); //限制执行时间 0为不限制$ip = 127.0.0.1;$port = 8001;//端口/**socket通信整个过程 socket_create //创建一个套接字socket_bind //给套接字绑定 ip 和端口socket_listen //监听套接字上的连接socket_accept //接受一个socket连接socket_read //接收客户端 发送的数据socket_write //将数据写到 socket 缓存 向客户端发送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";}$count = 0;do { if (($msgsock = socket_accept($sock)) = 5){ break; };} //echo $buf; socket_close($msgsock);} while (true);socket_close($sock);?>

运行php 文件,运行后 ,应该看不见结果 , 可以使用 netstat -ntlp 查看 8001 端口是否被占用。参见下图。

2. 其客户端代码:

<?phperror_reporting(E_ALL);set_time_limit(0);echo "socket通信客户端\n";$port = 8001;//端口$ip = "127.0.0.1";//ip/**socket连接整个过程 socket_create //建立一个socket 连接 socket_connect // 开始一个socket连接 连接服务端 socket_write //将数据写入缓存 向服务端发送 socket_read// 读取服务端的结果 socket_close // 关闭套接字资源 */$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);if ($socket < 0) { echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";}else { echo "OK.\n";}echo "试图连接 $ip 端口 $port...\n";$result = socket_connect($socket, $ip, $port);if ($result < 0) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";}else { echo "连接OK\n";}$in = "Ho\r\nfirst blood\r\n";$out = \;if(!socket_write($socket, $in, strlen($in))) { echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n";}else { echo "发送到服务器信息成功!\n"; echo "发送的内容为:$in

";}while($out = socket_read($socket, 8192)) { echo "接收服务器回传信息成功!\n"; echo "接受的内容为:",$out;}echo "关闭SOCKET...\n";socket_close($socket);echo "关闭OK\n";?>

在看看服务端的窗口结果:

说明: PHP 语言的特性决定了php 在这方面它只适合做客户端,不适合做服务端。

【相关教学推荐】

1. 《独孤九贱(4)-php视频教学》

2. php编程从入门到精通全套教学

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。