判断类是否有某个属性_94、Workerman通信框架-传输层-TcpConnection类解析

该类继承于ConnectionInterface接口,负责tcp传输层的逻辑处理.

1、TcpConnection类设计

  • 类概要
c3e5cb59ec23d3dd11f4b3cc61803b18.png

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关于此连接的信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值