手机版

简单解释:php的套接字通信原理

时间:2021-09-07 来源:互联网 编辑:宝哥软件园 浏览:

你对TCP/IP、UDP和Socket编程很熟悉吧?随着网络技术的发展,这些话充斥着我们的耳朵。然后我想问:

1.什么是TCP/IP和UDP?

2.插座在哪里?

3.什么是插座?

4.你能用吗?

什么是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协议家族诞生在生活中,这不一定是真的。

让我们从服务器开始。服务器首先初始化Socket,然后绑定到端口,监听端口,调用接受阻塞,等待客户端连接。此时,如果客户端初始化一个套接字,然后连接到服务器,如果连接成功,客户端和服务器之间的连接就建立了。客户端发送数据请求,服务器接收并处理请求,然后将响应数据发送给客户端,客户端读取数据,最后关闭连接,第一次交互结束。

套接字相关功能:

-

Socket_accept()接受套接字连接socket_bind()将套接字绑定到一个IP地址和端口socket_clear_error()清除套接字错误或最后一个错误代码socket _ close()关闭一个套接字资源socket_connect()启动套接字连接socket_create_listen()在指定的端口打开一个套接字并侦听socket_create_pair()以生成一对无法区分的套接字到数组中。Socket _ create()生成一个套接字。相当于生成一个socket数据结构socket_get_option()获取socket option socket_getpeername()获取远程同类主机的ip地址socket_getsockname()获取本地socket socket_iovec_add()的ip地址向分布式/聚合数组socket_iovec_alloc()添加一个新的向量这个函数创建一个iovec数据结构socket_iovec_delete()可以发送、接收、读取, 并删除已分配的iovec socket_iovec_fetch()返回指定的iovec资源数据socket_iovec_free()释放一个iovec资源socket_iovec_set()设置新的iovec数据值socket_last_error()并获取当前套接字的最后一个错误代码socket_listen()侦听指定套接字的所有连接。 socket_read()读取指定长度的数据。socket_readv()从分布式/聚合数组中读取数据。socket_recv()完成从套接字到缓存的数据。socket _ recvfrom()接受来自指定套接字的数据。如果未指定,默认的当前套接字socket_recvmsg()接受来自iovec的socket_select()消息。该函数将数据发送到连接的套接字socket_sendmsg()并将消息发送到套接字socket_sendto()将消息发送到指定的地址。socket _ set _ block()在socket中设置为阻塞模式。socket_set_option()在socket中设置为非阻塞模式。此功能允许您关闭阅读。Write,或指定的socketsocket _ stress()返回指定错误号的详细错误socket_write()将数据写入套接字缓存socket_writev()将数据写入分布式/聚合数组案例1:套接字通信演示

服务器端:

?Php//连接客户端时确保没有超时设置_ time _ limit(0);$ IP=' 127 . 0 . 0 . 1 ';$ port=1935/* * - * @套接字通信的全过程。@ socket _ accept * @ socket _ read * @ socket _ write * @ socket _ close-*//*-。如果(($ 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(($ msg sock=socket _ accept($ sock))0){ echo ' socket _ accept()failed : reason : '。socket_strerror($msgsock),”\ n ';打破;} else {//发送到客户端$msg='测试成功!\ n ';socket_write($msgsock,$msg,strlen($ msg));Echo“测试成功\ n”;$buf=socket_read($msgsock,8192);$talkback='收到信息: $ buf \ n ';echo $对讲;if($ count=5){ break;};}//echo $ buf;socket _ close($ msgsock);} while(true);socket _ close($ sock);这是套接字的服务器代码。然后运行cmd,注意自己的程序存储路径。

没有反射,但是现在服务器程序已经开始运行,端口已经开始监听。运行netstat -ano检查端口状态。我的港口是1935年

看,端口已经处于监听状态。接下来,我们只需要运行客户端程序进行连接。上层代码

?phperror _ reporting(E _ ALL);set _ time _ limit(0);回显“h2TCP/IP连接/H2 \ n”;$ port=1935$ IP=' 127 . 0 . 0 . 1 ';/* *-插座连接的全过程。@ socket _ read * @ socket _ close-*/$ socket=socket _ create(AF _ INET,SOCK_STREAM,SOL _ TCP);if($ socket 0){ echo ' socket _ create()失败:原因:socket_strerror($socket)。\ n ';}else { echo 'OK。\ n ';}echo试图连接到“$ip”端口“$port”.\ n ';$result=socket_connect($socket,$ip,$ port);if($ result 0){ echo ' socket _ connect()失败。\ n原因: ($result)”。socket_strerror($result)。\ n ';} else { echo ' connect OK \ n} $ in=' Ho \ r \ n十美元。='第一滴血\ r \ n ';$ out=if(!socket_write($socket,$in,strlen($ in)){ echo ' socket _ write()失败:原因: '。socket_strerror($socket)。\ n ';} else { echo }已成功将信息发送到服务器!\ n ';“Echo”发送: font color=“red”$ in/font br;} while($ out=socket _ read($ socket,8192)) {echo '成功接收到服务器返回的信息!\ n ';Echo '接受: ',$ out}echo' close SOCKET.\ n ';socket _ close($ socket);回应“关闭确定\ n”;

此时,客户端已经连接到服务器。

案例2:详细的代码解释

//设置一些基本变量$ host=' 192 . 168 . 1 . 99 ';$ port=1234//设置超时时间set _ time _ limit(0);//创建套接字$ socket=socket _ create (af _ inet,sock _ stream,0)或die('无法创建套接字\ n ');//将套接字绑定到端口$ result=socket _ bind ($ socket,$ host,$ port)或die('无法绑定到套接字\ n ');//开始侦听链接$ result=socket _ listen ($ socket,3)或die('无法设置套接字侦听程序\ n ');//接受传入连接//另一个套接字来处理通信$ spawn=socket _ accept ($ socket)或die('无法接受传入连接\ n ');//获取客户端的输入$ input=socket _ read ($ spawn,1024)或die('无法读取输入\ n ');//清空输入字符串$ input=trim($ input);//处理客户端输入并返回结果$ output=strref ($ input)。\ n ';socket_write($spawn,$output,strlen ($output))或die('无法写入output \ n ');//close socket _ close($ spawn);socket _ close($ socket);以下是每个步骤:的详细描述

1.第一步是建立两个变量来保存Socket运行的服务器的IP地址和端口。您可以将其设置为自己的服务器和端口(该端口可以是1到65535之间的数字),前提是不使用该端口。

//设置两个变量$ host=' 192 . 168 . 1 . 99 ';$ port=12342.在服务器端,您可以使用set_time_out()函数来确保PHP在等待客户端连接时不会超时。

//超时set _ time _ limit(0);3.在上面的基础上,是时候使用Socket_creat()函数创建一个Socket了——这个函数返回一个Socket句柄,这个句柄将在以后的所有函数中使用。

//创建套接字$ socket=socket _ create (af _ inet,sock _ stream,0)或die('无法创建套接字\ n ');第一个参数“AF_INET”用于指定域名;

第二个参数“SOCK_STREM”告诉函数将创建什么类型的套接字(本例中为TCP类型)

因此,如果您想创建一个UDP套接字,您可以使用下面的代码:

//创建套接字$ socket=socket _ create (af _ inet,sock _ dgram,0)或die('无法创建套接字\ n ');4.创建套接字句柄后,下一步是将其指定或绑定到指定的地址和端口。这可以通过socket_bind()函数来完成。

//绑定套接字以指定地址和端口$ result=socket _ bind ($ socket,$ host,$ port)或die('无法绑定到套接字\ n ');5.创建套接字并绑定到端口后,您可以开始监听外部连接。PHP允许您通过socket_listen()函数开始监听,并且您可以指定一个数字(在本例中,第二个参数是:3)

//开始侦听连接$ result=socket _ listen ($ socket,3)或die('无法设置套接字侦听程序\ n ');6.到目前为止,您的服务器除了等待来自客户端的连接请求之外,基本上什么也没做。一旦接收到来自客户端的连接,Socket_accept()函数就开始工作。它接收连接请求,并调用另一个子套接字来处理客户端和服务器之间的信息。

//接受请求链接//调用子套接字处理信息$ spawn=socket _ accept ($ socket)或die('无法接受传入连接\ n ');这个子套接字现在可以用于后续的客户机-服务器通信。

7.建立连接后,服务器会等待客户端发送一些输入信息,这些信息可以通过socket_read()函数获取,并分配给PHP的$input变量。

//读取客户端输入$ input=socket _ read ($ spawn,1024)或die('无法读取输入\ n ');socker_read的第二个参数用于指定读取的字节数,您可以限制从客户端获取的数据大小。

请注意,socket_read函数将始终在shell结束时读取数据,直到它满足\n,\t或\0个字符。PHP脚本将这个书写字符视为输入的终止符。

8.现在,服务器必须处理客户端发送的数据(在本例中,处理只包括向客户端输入和返回数据)。这一部分可以通过socket_write()函数来完成(使得通信套接字可以将数据流发送回客户端)

//处理客户端输入并返回数据$ output=strref ($ input)。\ n ';socket_write($spawn,$output,strlen ($output))或die('无法写入output \ n ');9.一旦输出返回到客户端,父/子套接字应该由socket_close()函数终止

//close socket _ close($ spawn);socket _ close($ socket);以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:简单解释:php的套接字通信原理是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。