该类继承于ConnectionInterface接口,负责tcp传输层的逻辑处理.
1、TcpConnection类设计
- 类概要
![c3e5cb59ec23d3dd11f4b3cc61803b18.png](https://i-blog.csdnimg.cn/blog_migrate/0d436e77dacb0d92da689875c5543a21.jpeg)
2、核心方法解析
- 构造方法
其传入参数$socket、$remote_address则通过stream_socket_accept方法获取
累加静态属性数组self::$statistics 1
设置属性id和_id
设置属性_socket,并设置为非阻塞
把_socket添加进网络event集合中,监听READ可读操作。对应的回调处理函数为当前TcpConnection类方法baseRead
接着,并依次设置属性 maxSendBufferSize、maxPackageSize、_remoteAddress
最后,把当前实例化对象保存在静态属性数组中$connections
- baseRead方法
从socket连接中读取self::READ_BUFFER_SIZE长度数据。然后进行判断数据是否存在
如果无数据和当前连接是否已经断开,则执行destroy方法断开
相反,则把接收到的数据与$this->_recvBuffer属性进行拼接
判断当前连接是否存在上层协议
不存在,判断是否存在onMessage回调方法,不存在则返回,相反则调用执行
如存在上层协议,以属性$this->_recvBuffer的值不为空和当前链接不不终止为循环的条件,执行:
- 调用上层协议静态方法input获取一个包的长度大小,并赋值给$this->_currentPackageLength
- 操作接收的字符串$this->_recvBuffer,截取0到$this->_currentPackageLength的长度内容
- 然后把剩下的重新赋值给$this->_recvBuffer,重置$this->_currentPackageLength为0
- 调用上层协议静态方法decode进行解包,然后调用onMessage回调方法
- 开始下一次循环
- send方法
判断当前连接是否处于关闭状态,如是则返回。相反则进行如下操作:
判断是否需要上层协议进行封包,如需要则进行封包
检查属性$this->_sendBuffer的大小是否为0,如为0则
往socket连接写入$send_buffer,然后进行判断,写入的长度是否与要发送的数据$send_buffer一致,如不一致则去掉已经写完的数据,把剩下的数据重新赋值给$this->_sendBuffer,往网络IO库添加write事件,等待下次write事件触发
相反,则先把要发送的数据$send_buffer与属性$this->_sendBuffer进行拼接
- baseWrite方法
往socket连接写入$this->_sendBuffer这么多数据,然后进行判断
- 如果刚好写完,则从网络IO库中,删除该连接的write事件
- 相反,则去掉已经写完的数据,把剩下的数据重新赋值给$this->_sendBuffer,等待下次write事件触发
- 如果有误则调用destroy
- close方法
判断当前连接是否处于关闭状态,如是则返回。
判断调用close方法的参数是否存在,如存在则调用send方法进行发送数据操作
再判断发送的数据是否发送完毕,如是则调用destroy,相反则调用pauseRecv
- destroy方法
判断当前连接是否处于关闭状态,如是则返回。
从网络IO库中,删除该连接的read、write事件,关闭该连接,设置该连接的属性status
判断该连接的属性onClose是否存在,存在则进行触发
判断该连接的上层协议是否存在onClose属性,如存在则进行触发
再次判断此连接是否处于关闭状态,如是则重置该对象的请求相关的属性,并删除该对象在所属的工作进程属性connections数组的值,删除TcpConnection类静态属性$connections关于此连接的信息