您好,登录后才能下订单哦!
这篇文章主要介绍了php中socket的简介,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
什么是socket?
Socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。Socket 起源于 UNIX,在 UNIX 一切皆文件的思想下,进程间通信就被冠名为文件描述符(file descriptor),Socket 是一种“打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
如图为Socket所在位置:
Socket 通信过程
Socket 保证了不同计算机之间的通信,也就是网络通信。对于网站,通信模型是服务器与客户端之间的通信。两端都建立了一个 Socket 对象,然后通过 Socket 对象对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接。
相关学习视频教程分享:php视频教程
下图是面向连接的 TCP 时序图:
客户端过程:
客户端的过程比较简单,创建 Socket,连接服务器,将 Socket 与远程主机连接(注意:只有 TCP 才有“连接”的概念,一些 Socket 比如 UDP、ICMP 和 ARP 没有“连接”的概念),发送数据,读取响应数据,直到数据交换完毕,关闭连接,结束 TCP 对话。
这里也可用 send() 方法:不同在于 sendall() 在返回前会尝试发送所有数据,并且成功时返回 None,而 send()则返回发送的字节数量,失败时都抛出异常。
服务端过程:
咱再来聊聊服务端的过程,服务端先初始化 Socket,建立流式套接字,与本机地址及端口进行绑定,然后通知 TCP,准备好接收连接,调用 accept() 阻塞,等待来自客户端的连接。如果这时客户端与服务器建立了连接,客户端发送数据请求,服务器接收请求并处理请求,然后把响应数据发送给客户端,客户端读取数据,直到数据交换完毕。最后关闭连接,交互结束。
调用 accept() 时,Socket 会进入waiting状态。客户端请求连接时,方法建立连接并返回服务器。accept() 返回一个含有两个元素的元组 (conn, addr)。第一个元素 conn 是新的 Socket 对象,服务器必须通过它与客户端通信;第二个元素 addr 是客户端的 IP 地址及端口。data = conn.recv(1024)
接下来是处理阶段,服务器和客户端通过 send() 和 recv() 通信(传输数据)。
服务器调用 send(),并采用字符串形式向客户端发送信息,send() 返回已发送的字符个数。
服务器调用 recv() 从客户端接收信息。调用 recv() 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv() 在接收数据时会进入blocked状态,最后返回一个字符串,用它表示收到的数据。如果发送的数据量超过了 recv() 所允许的,数据会被截短。多余的数据将缓冲于接收端,以后调用 recv() 时,会继续读剩余的字节,如果有多余的数据会从缓冲区删除(以及自上次调用 recv() 以来,客户端可能发送的其它任何数据)。传输结束,服务器调用 Socket 的 close() 关闭连接。
从 TCP 连接的视角看 Socket 过程:
TCP 三次握手的 Socket 过程:
1、服务器调用 socket()、bind()、listen() 完成初始化后,调用 accept() 阻塞等待;
2、客户端 Socket 对象调用 connect() 向服务器发送了一个 SYN 并阻塞;
3、服务器完成了第一次握手,即发送 SYN 和 ACK 应答;
4、客户端收到服务端发送的应答之后,从 connect() 返回,再发送一个 ACK 给服务器;
5、服务器 Socket 对象接收客户端第三次握手 ACK 确认,此时服务端从 accept() 返回,建立连接。
接下来就是两个端的连接对象互相收发数据。
TCP 四次挥手的 Socket 过程:
1、某个应用进程调用 close() 主动关闭,发送一个 FIN;
2、另一端接收到 FIN 后被动执行关闭,并发送 ACK 确认;
3、之后被动执行关闭的应用进程调用 close() 关闭 Socket,并也发送一个 FIN;
4、接收到这个 FIN 的一端向另一端 ACK 确认。
感谢你能够认真阅读完这篇文章,希望小编分享的“php中socket的简介”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。