一次对/cable的请求,就会创建一个ApplicationCable::Connection < ActionCable::Connection::Base,但Server不会持有此connection


connection包含WebSocket,而WebSocket包含ClientSocket



而ClientSocket包含Stream(Stream也持有ClientSocket)。

当调用connection的process时,实际上是调用ClientSocket的rack_response -> start_driver -> @stream.hijack_rack_socket


hijack_rack_socket所做的就是让Server中的event_loop去监听当前这个tcp_socket


event_loop是一个StreamEventLoop的对象,内含一个死循环的线程。该线程会先检查todo队列(内含增加监听和取消监听的指令),然后阻塞在nio监听。

当tcp_socket可读时,就会读出数据交给stream -> client_socket#parse


client_socket#parse实际上是将数据交由WebSocket::Driver去解析,然后根据解析结果回调触发client_socket去处理(例如寻找具体的Channel类去处理)


以上涉及的对象关系图如下


完整如下

20200830_174529_083_postchannel_70208320541060.html