手机版

详细解释php套接字通信

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

你对TCP/IP、UDP和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协议家族诞生在生活中,这不一定是真的。

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

套接字相关功能:-。将套接字绑定到一个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()可以发送、接收、读取, 并删除一个已分配的iovecsocket _ iovec _ fetch()返回指定的iovec资源数据socket_iovec_free()释放一个iovec资源socket_iovec_set()设置新的iovec数据值socket_last_error()并获取当前套接字的最后一个错误代码socket_listen()侦听指定套接字的所有连接。 socket_read()读取指定长度的数据。socket_readv()从分布式/聚合数组中读取数据。socket_recv()完成从套接字到缓存的数据。socket _ recvfrom()接受来自指定套接字的数据。如果未指定,默认情况下,当前socketsocket_recvmsg()接受来自iovec的socket_select()消息。此函数将数据发送到连接的socketsocket_sendmsg()并将消息发送到socketsocket_sendto()将消息发送到指定的地址。socketsocket_set_block()在套接字中设置为阻塞模式。socket_set_option()在socket中设置为非阻塞模式。此函数允许您关闭读取、写入或指定的socketsocket_strerror()返回带有指定错误号的详细错误socket_write(),将数据写入套接字缓存socket_writev(),并将数据写入分布式/聚合数组

案例1:套接字通信演示

服务器端:

1 ?Php 2 //保证连接客户端3 set_time_limit(0)时不会超时;4 5 $ IP=' 127 . 0 . 0 . 1 ';6美元港口=1935年;7 8/* 9-10 * @ socket通讯的全过程11。@ socket _ listen 15 * @ socket _ accept 16 * @ socket _ read 17 * @ socket _ write 18 * @ socket _ close 19-20 */21 22/* */23 if($ sock=socket _ create(af _ inet,sock _ stream,sol _)是以下操作的手册25 } 26 27 if($ ret=socket _ bind($ sock,$ IP,$ port)) 0) {28 echo的socket _ bind()因为: '而失败。socket _ strerror ($ ret .)'\ n ';29 } 30 31 if($ ret=socket _ listen($ sock,4)) 0) {32 echo的socket _ listen()因: '而失败。socket _ strerror ($ ret)。\ n ';33 } 34 35美元计数=0;36 37 do { 38 if(($ msg sock=socket _ accept($ sock))0){ 39 echo ' socket _ accept()failed : reason : '。socket_strerror($msgsock)。\ n ';40休息;41} else {42 43 //发送到客户端44 $msg='测试成功!\ n ';45 socket_write($msgsock,$msg,strlen($ msg));46 47回声“测试成功\ n”;48 $buf=socket_read($msgsock,8192);49 50 51 $talkback='收到信息: $ buf \ n ';52 echo $对讲;53 54 if($ count=5){ 55 break;56 };57 58 59 } 60//echo $ buf;61 socket _ close($ msg sock);62 63 } while(真);64 65 socket _ close($ sock);66 ?这是套接字的服务器代码。然后运行cmd,注意自己的程序存储路径。

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

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

1 ?php 2错误_报告(E _ ALL);3 set _ time _ limit(0);四回显" h2TCP/IP连接/H2 \ n”;5 6美元港口=1935年;7 $ IP=' 127。0 .0 .1 ';8 9/* 10-11 * @插座连接整个过程12-13 * @ socket _ create 14 * @ socket _ connect 15 * @ socket _ write 16 * @ socket _ read 17 * @ socket _ close 18-19 */20 21 $ socket=socket _ create(AF _ INET,SOCK_STREAM,SOL _ TCP);22 if($ socket 0){ 23 echo ' socket _ create()失败:原因: '。socket_strerror($socket ).\ n ';24 }否则{ 25 }回应"好的"。\ n ';26 } 27 28回声报试图连接$ip '端口$port '.\ n ';29 $ result=socket _ connect($ socket,$ip,$ port);30 if($结果0) { 31 echo 'socket_connect()失败\ n .原因:美元(结果)”。socket_strerror($result ).\ n ';32 }else { 33 echo '连接"确定\ n ";34 } 35 36美元in=' Ho \ r \ n37美元。='第一滴血\ r \ n ';38美元出=' ';39 40如果(!socket_write($socket,$in,strlen($ in))){ 41 echo ' socket _ write()失败:原因: '。socket_strerror($socket ).\ n ';42 }else { 43 echo '发送到服务器信息成功!\ n ';44回声报发送的内容为: font color=' red ' $ in/font br ';45 } 46 47 while($ out=socket _ read($ socket,8192)) { 48 echo '接收服务器回传信息成功!\ n ';49回声报接受的内容为: ',$ out' 50 } 51 52 53回声'关闭窝.\ n ';54 socket _ close($ socket);55回声报关闭"确定\ n ";56 ?

至此客户端已经连接上服务端了。

案例二:代码详解

//设置一些基本的变量$ host=' 192。168 .1 .99 ';$ port=1234//设置超时时间set _ time _ limit(0);//创建一个socket $ 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($产卵,1024)或' die('无法读取输入\ n ');//清空输入字符串$ input=trim($ input);//处理客户端输入并返回结果$ output=strev($ input).\ n ';socket _ write($产卵,$输出,strlen($输出))或' die('无法写入输出\ n’);//关闭socket socket _ close($产卵);socket _ close($ socket);

下面是其每一步骤的详细说明:

1.第一步是建立两个变量来保存窝运行的服务器的互联网协议(互联网协议)地址和端口。你可以设置为你自己的服务器和端口(这个端口可以是一到65535之间的数字),前提是这个端口未被使用。

[复制到剪贴板]PHP代码:

//设置两个变量$ host=' 192。168 .1 .99 ';$ port=1234

2.在服务器端可以使用set_time_out()函数来确保服务器端编程语言(专业超文本预处理器的缩写)在等待客户端连接时不会超时。

[复制到剪贴板]PHP代码:

//超时时间set _ time _ limit(0);

3.在前面的基础上,现在该使用socket_creat()函数创建一个窝了—这个函数返回一个窝句柄,这个句柄将用在以后所有的函数中。

[复制到剪贴板]PHP代码:

//创建socket $ socket=socket _ create(AF _ INET,SOCK_STREAM,0)或' die('无法创建套接字\ n’);第一个参数" AF_INET "用来指定域名;第二个参数" SOCK_STREM "告诉函数将创建一个什么类型的插座(在这个例子中是三氯苯酚类型)

因此,如果你想创建一个用户数据报协议(User Datagram Protocol)套接字的话,你可以使用如下的代码:

[复制到剪贴板]PHP代码:

//创建socket $ socket=socket _ create(AF _ INET,SOCK_DGRAM,0)或' die('无法创建套接字\ n’);

4.一旦创建了一个窝句柄,下一步就是指定或者绑定它到指定的地址和端口。这可以通过socket_bind()函数来完成。

[复制到剪贴板]PHP代码:

//绑定插座至指定地址和端口$result=socket_bind ($socket,$host,$port)或' die('无法绑定到套接字\ n’);

5.创建套接字并绑定到端口后,您可以开始监听外部连接。PHP允许您通过socket_listen()函数开始监听,并且您可以指定一个数字(在本例中,第二个参数是:3)

[复制到剪贴板]PHP代码:

//开始侦听连接$ result=socket _ listen ($ socket,3)或die('无法设置套接字侦听程序\ n ');

6.到目前为止,您的服务器除了等待来自客户端的连接请求之外,基本上什么也没做。一旦接收到来自客户端的连接,Socket_accept()函数就开始工作。它接收连接请求,并调用另一个子套接字来处理客户端和服务器之间的信息。

[复制到剪贴板]PHP代码:

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

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

[复制到剪贴板]PHP代码:

//读取客户端输入$ input=socket _ read ($ spawn,1024)或die('无法读取输入\ n ');gt。

socker_read的第二个参数用于指定读取的字节数,您可以通过它限制从客户端获取的数据大小。

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

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

[复制到剪贴板]PHP代码:

//处理客户端输入并返回数据$ output=strref ($ input)。\ n ';socket_write ($spawn,$output,strlen ($output))或die('无法写入output \ n ');

9.一旦输出返回到客户端,父/子套接字应该由socket_close()函数终止

[复制到剪贴板]PHP代码:

//close socket _ close($ spawn);socket _ close($ socket);

以上是对PHP socket通信案例的详细讲解,希望能帮助我们进一步学习socket通信知识。

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