手机版

简单的php套接字编程

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

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

1.什么是TCP/IP和UDP?2.2在哪里。插座?3.什么是3。插座?4.你能用吗?

什么是TCP/IP和UDP?

Tcp/IP(传输控制协议/互联网协议)是传输控制协议/互联网协议,是为广域网设计的工业标准协议集。

UDP(用户数据协议)是与TCP相对应的协议。它属于TCP/IP协议家族之一。

下面是显示这些协议之间关系的图表。

TCP/IP协议家族包括传输层、网络层和链路层。现在你知道TCP/IP和UDP的关系了。

插座在哪里?

在图1中,我们没有看到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的ip地址socket_iovec_add()。将新向量添加到分布式/聚合数组socket_iovec_alloc()此函数创建一个iovec数据结构socket_iovec_delete(),它可以发送、接收、读取和写入,并删除已分配的iovecsocket_iovec_fetch()。返回指定iovec资源的data 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_nonblock()套接字被设置为非阻塞模式。socket_set_option()设置为socket_shutdown。此函数允许您关闭读取、写入或指定的socketsocket_strerror()返回带有指定错误号的详细错误socket_write(),将数据写入套接字缓存socket_writev(),并将数据写入分布式/聚合数组。

案例一:套接字通信演示。

服务器端:

?Php//确保客户端连接不会超时set _ time _ limit(0);$ IP=' 127 . 0 . 0 . 1 ';$ port=1935/* *-整个* @ socket通信的过程。@ 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 _ stress ($ 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 ' send : font color=' red ' $ in/font br ';} while($ out=socket _ read($ socket,8192)) {echo '成功接收到服务器返回的信息!\ n ';Echo '接受: ',$ out}echo' close SOCKET.\ n ';socket _ close($ socket);回应“关闭确定\ n”;

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

案例二:详细的代码解释。

//设置一些基本变量$ 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('无法创建套接字\)。第一个参数“AF_INET”用于指定域名;第二个参数“SOCK_STREM”告诉函数将创建什么类型的套接字(本例中为TCP类型)。

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

复制代码如下://Create socket $ socket=socket _ Create(af _ inet,sock _ dgram,0)或die('无法创建socket \ 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 ($产卵,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或者邮箱删除。