socket编程 - Event扩展的使用(二)

socket编程 - Event扩展的使用(一)中使用Event类搭配原生的socket函数实现了基于epoll的事件通知回调的http服务器,其实还是要自己写大量的原生socket函数来。实际上Event扩展提供了更加精简的方式来实现,那就是 EventListener类 和 EventBufferEvent类,对应 libevent 的io缓存事件功能。

EventListener:监听,自动accept并调用回调。
EventBuffer:封装了操作buffer的方法,buffered I/O。
EventBufferEvent:io缓存事件,将事件和数据做了封装,自动完成read和write操作,将事件和EventBuffer做了一个结合。
EventUtil:Event助手类。

一、EventListener类
在这里插入图片描述
1、callback $cb
当有客户端连接的时候会触发此回调函数。
在这里插入图片描述
如果监听的是IP:PORT,经测试,
fd:为客户端连接文件描述符,是操作系统的fd号,整型,是会被重复使用的,这一点和之前有所不同。
address:客户端的ip和端口数组。

2、target
要监听的目标,可以是:

  • 字符串:可以是 “0.0.0.0:8888” 或者 “unix:/tmp/my.sock”
  • socket资源
  • stream资源

二、EventBufferEvent类

1、构造函数
在这里插入图片描述
socket:一般为客户端fd。
readcb:如果有数据过来,EventBufferEvent会自动读取数据到EventBuffer对象,读完之后会调用此回调函数,在此开发人员可以处理这些业务数据。
writecb:如果output buffer有数据,EventBufferEvent会自动发送出去,全部的数据发送完了,就会回调此函数,在此开发人员可以处理后续的业务。
eventcb:事件回调,在某些情况下,底层会调用这个回调。

当然,如果不想在构造的时候设置回调,也可以后面去调用 setCallbacks 方法来设置。
在这里插入图片描述
特别注意一点
在之前我们提到过,如果客户端主动断开连接,服务端对应的fd会有read事件通知,但是会读到空数据,然后以此判断是客户端断开。但是在EventBufferEvent中,客户端断开不会回调readcb,而会回调eventcb,对应的事件为 EventBufferEvent::EOF

2、关于 buffer event callbacks
官网在这一部分没有同步更新,比如 EventBufferEvent::EOL 已经换成 EventBufferEvent::EOF,而且值为17,不是16。
在这里插入图片描述
至此,我们可以可以很方便的为 EventBufferEvent 设置各种回调,然后,我们需要像 Event::add() 一样将某个事件添加到事件循环,使用 EventBufferEvent ::enable(Event::READ)。

同样的,如果关闭客户端或者客户端主动关闭,都需要调用 free() 方法。

三、EventBuffer类

EventBuffer represents Libevent’s “evbuffer”, an utility functionality for buffered I/O.

该类实现了很多对于数据的处理,该类的对象会用在 EventBufferEvent 和 EventHttpRequest 对象里面。

创建buffer对象,并写入字符串
在这里插入图片描述
关于如何读取eventBuffer中的内容:
1、copyout:从头读取指定的字节,但是不清除eventBuffer。
2、drain:从头清除指定字节的数据,无法获取数据。
3、read:从头读取指定字节的数据,并清除他们。
4、readLine:从头读取一行数据,并清除这一行,需要指定换行符;如果没有找到换行符,那么说明不是一个完整的行,此函数返回NULL,这一点很坑,这就要求你发送的数据包最后必须加上换行符。官网的Demo使用的就是readLine,我在使用postman发送body数据的时候在最后没有敲一个回车,导致readLine读不到数据。

具体代码
https://gitee.com/phprao/socket/blob/master/server/socketServerListener.php

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值