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对象,并写入字符串
具体代码
https://gitee.com/phprao/socket/blob/master/server/socketServerListener.php