WebKit之WebSocket

转载 2015年11月20日 00:34:32

WebSocket是HTML5的一个重要特性,能提供client和server的双向通信,是很多WebAPP做网络通信的首选,不过它在Android的WebKit中并不支持,也就造就了socket.io的流行。在我们云OS中当然不能漏掉这个特性,我这周的任务就是要在云OS的Webkit中支持websocket,以此让WebApp能直接调用websocket API。

某些平台的webkit(比如Android)不支持websocket并不是webkit没管这块,而是这一特性需要在各个平台特有的网络层中做porting。所以初步判断只需要补全网络层的读写即可。先看看源码WebCore/Modules/websockets,和websocket相关的代码都在这个文件夹中,其结构如下:


通过WebSocket.cpp, WebSocket.h和WebSocket.idl包装websocket js API,所以在js中new WebSocket("...",...");时,反映到webkit就是:

  1. WebSocket.cpp -> WebSocketChannel.cpp -> WebSocketFrame.cpp, WebSocketHandshake.cpp -> SocketStreamHandle  

其中,WebSocket.cpp是JS API包装,WebSocketChannel.cpp是channel的包装,WebSocketFrame.cpp和WebSocketHandshake.cpp处理websocket的上层协议,SocketStreamHandle处理网络流。当SocketStreamHandle读到数据后,又通过:

  1. SocketStreamHandle->SocketStreamHandleClient->WebSocketChannelClient  

这样的路径把消息发送到JS中的onmessage的回调中,其中WebSocketChannel.cpp是SocketStreamHandleClient的实现,WebSocket.cpp是WebSocketChannelClient的实现,因此这么看来WebSocket整个下层的结构和信息回路就清楚了。

分析完webkit代码后,会发现webkit已经把websocket的架子和协议都已做好,唯独缺了SocketStreamHandle中数据的读和写,也证实了我开始的判断。看SocketStreamHandleBase.h和SocketStreamHandleBase.cpp会发现,只需要继承SocketStreamHandleBase并实现虚方法platformSend和platformClose,另外读到数据后调用SocketStreamHandleClient.didReceiveSocketStreamData把数据发送上层,这样整个websocket就完整了。

实现这几个方法并不困难,需要关注的是这里需要基于异步的网络读写,功底好的可以直接epoll或者select,如果新手或者有跨平台的需求,可以用libevent,我就是使用了这个库,具体代码就不贴了,标准libevent读和写足矣。

补全websocket后,不但可以在JS API中提供websocket支持,也可以在native端提供websocket client端的能力,和js不同的是,native没有js的执行环境,也不需要WebSocket.cpp的包装,所以应该直接从WebSocketChannel.cpp开始用起,比如:

  1. RefPtr<WebSocketChannel> wsChannel = WebSocketChannel::create(page->mainFrame()->document(), channel);  
  2. KURL url = KURL(KURL(), String("ws://127.0.0.1:9223"));  
  3. wsChannel->connect(url, String("webkit"));  
这里的channel是WebSocketChannelClient的一个实现,在js环境是这个实现是WebSocket.cpp,而在native端就需要我们单独实现,重要的是实现didReceiveMessage方法,这是websocket协议解析后的message回调,这样就相当于在js中使用onmessage方法了。

其他websocket的部分就不多提了,对协议有兴趣的朋友可以重点看WebSocketFrame.cpp和WebSocketHandshake.cpp,对webkit idl感兴趣的可以看WebSocket.cpp, WebSocket.h和WebSocket.idl。总之,小小的websocket还是有很多干货的。

探索WebKit内核(三)------ WebSocket

WebSocket是HTML5的一个重要特性,能提供client和server的双向通信,是很多WebAPP做网络通信的首选,不过它在Android的WebKit中并不支持,也就造就了socket.i...

让Android的WebView支持WebSocket

一,背景 这段时间项目上需要整合一系列的网站,由于网站是用python tornado的异步框架,需要用支持WebSocket的浏览器的支持,而比较悲剧的是,Android的内置...

qt 很好的封装了 webkit内核

2.为何选择QT的WebKit与Extjs开发企业应用       ExtJs是一个用于创建Web用户界面的JS框架,提供了丰富的界面部件及布局方式,对于web开发者来说,实现企业应用所需的各种画...

实现QT与HTML页面通信

1.  前言 最近,C++和WEB本地混合应用开发模式逐渐流行起来,个人也认为标记语言描述的界面是界面开发的一个发展趋势。WPF、Java FX,当然也少不了Html。基于Html的界面在开发效率,可...

/proc/N/maps 信息是如何生成的?

以进程1为例,查看proc长什么样子? 127|shell@tiny4412:/proc/1 # ls -l dr-xr-xr-x root root 2014...

带头尾指针的list的C实现

一、缘起 很早写了一个带头尾指针的list,该list支持从尾部插入元素,在任意位置删除元素,最近用这个list时发现一个bug,修正了,并加了几个接口函数。贴出来,希望对C的初学者有用。 二、基...
  • maopig
  • maopig
  • 2012年02月22日 23:30
  • 2936

webkit HTML5 WebSocket 综合分析 1

csdn lidp  http://blog.csdn.net/perfectpdl 作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、W...

webkit HTML5 WebSocket 综合分析 2

csdn lidp  http://blog.csdn.net/perfectpdl 上一篇文章介绍了 websocket理论,本篇分析websocket协议客户端部分在webkit浏览器引...

WebKit之WebSocket的初步源码分析2

static PassRefPtr  ThreadableWebSocketChannel::create(ScriptExecutionContext*, WebSocketChannelClien...
  • sauphy
  • sauphy
  • 2015年12月10日 17:38
  • 469

WebKit WebInspector 与websocket

接入chromium远程调试的记录 Table of Contents 1 Web Inspector in mobile chromium 1.1 frontend/backe...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebKit之WebSocket
举报原因:
原因补充:

(最多只允许输入30个字)