在PHP中简单理解的socket随笔
本文主要是对没有基础或者有一点基础的PHPer的技术分享,大牛(觉得我写的有误的)有幸看到可以评论指点一下,万分感谢!
随着我们个人技术的成长,项目的要求,可能在开发中会用到实时更新,或者聊天室的一些模块,所以在技术方面就会用到socket来实现这些模块。下面就简单来说说自己的理解。
首先来说说socket的使用场景:(手游)聊天室,消息推送,数据转发,代&理,游戏服务器。我自己有实践过聊天室,消息推送,数据转发。但是后两者就没有‘玩过’了。可能之后会做个小游戏玩玩,那都是后话了。
说说什么是socket吧
socket是网络通信协议中的应用层与TCP/IP协议通信的中间软件的抽象层,他是一组接口,在设计模式中,socket是一个门面模式,把复杂的TCP/IP协议隐藏在socket接口的后面。
感谢图作者工作原理:socket的通信需要服务端和客户端组成;服务端:先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接;客户端:客户端初始化一个socket,然后连接服务器,如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
原理图所以通过上面,socket就是要我们自己创建服务端和客户端。
常用的socket的函数列出一些,大家可以根据常用的去查用法,我就不在这里列出用法了。
总结下常用的socket函数
服务端:
socket_create 创建socket设置基本参数
socket_bind 绑定ip和端口号
socket_listen 监听
socket_accept 客户端的连接
socket_read 读取客户端的数据
socket_write 给单独客户端发送数据
socket_close 关闭连接
客户端:
socket_create 创建socket设置基本参数
socket_connect 连接socket
socket_write 给服务端发送数据
socket_read 读取服务端数据
socket_close 关闭连接
建立的链接code在本文后面附的github地址,因为是使用的laravel框架,具体使用方法在地址
https://github.com/HH8023/study/tree/master/node_laravel
在最后说一个相关的面试题:
进程间通讯的方式有哪些,各有什么优缺点:
1)管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用。进程的亲缘关系通常是指父子进程关系。
2)有名管道(FIFO):有名管道也是半双工的通信方式,但是允许在没有亲缘关系的进程之间使用,管道是先进先出的通信方式。
3)信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
4)消息队列:消息队列是有消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
5)信号 ( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
6)共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
7)套接字( socket ) :套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。