Chromium 中HTML5 WebSocket实现分析c++(二)

看下websocket调用过程:

基本定义参考上一篇:

Chromium 中HTML5 WebSocket实现分析c++(一)-CSDN博客

一、前端测试用例

参考:HTML5 WebSocket | 菜鸟教程 (runoob.com)

websocket.html文件如下:

html 复制代码
<!DOCTYPE HTML>
<html>
   <head>
   <meta charset="utf-8">
   <title>WebSocket 测试页面</title>
    
      <script type="text/javascript">
         function WebSocketTest()
         {
            if ("WebSocket" in window)
            {
               alert("您的浏览器支持 WebSocket!");
               
               // 打开一个 web socket
               var ws = new window.WebSocket("ws://localhost:9998/echo");
                
               ws.onopen = function()
               {
                  // Web Socket 已连接上,使用 send() 方法发送数据
                  ws.send("发送数据");
                  alert("数据发送中...");
               };
                
               ws.onmessage = function (evt) 
               { 
                  var received_msg = evt.data;
                  alert("数据已接收...");
               };
                
               ws.onclose = function()
               { 
                  // 关闭 websocket
                  alert("连接已关闭..."); 
               };
            }
            
            else
            {
               // 浏览器不支持 WebSocket
               alert("您的浏览器不支持 WebSocket!");
            }
         }
      </script>
        
   </head>
   <body>
   
      <div id="sse">
         <a href="javascript:WebSocketTest()">运行 WebSocket</a>
      </div>
      
   </body>
</html>

二、webscoket服务端搭建:

参考:HTML5 WebSocket | 菜鸟教程 (runoob.com)

三、启动浏览器打开websocket.html页面:

1、net进程ID**=17324**

2、 webscoket测试页面进程ID=17796

四、附加上net ID**=17324和 render ID=17796****进程开始调式。**

1、点击页面"运行 WebSocket"按钮【render进程ID=17796

2、在【render进程ID=17796

1)、开始构建websocket对象out\Debug\gen\third_party\blink\renderer\bindings\modules\v8\v8_websocket.cc

void ConstructorCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {

RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_DOMWebSocket_constructor");

BLINK_BINDINGS_TRACE_EVENT("WebSocket.constructor");

...........

}

2)、发送mojom消息NetworkContextProxy::CreateWebSocket给net进程【net ID**=17324**】
通知构建websocket对象:
3)、net进程【net ID**=17324**】收到NetworkContextProxy::CreateWebSocket

开始构造:WebSocket::WebSocket()对象【services\network\websocket.cc】

4)、至此window.websocket对象构建完毕。
5)、前端运行 ws.send("发送数据"); 给 render进程ID=17796
6)、render进程ID=17796 收到前端函数ws.send("发送数据")调用

在DOMWebSocket::send中响应:

7)、DOMWebSocket::send调用 WebSocketProxy::SendMessage通知net进程【net ID**=17324**】发送消息。
8)、net进程收到impl->SendMessage消息开始响应【net ID**=17324**】
9)、net进程【net ID**=17324**】开始接收服务端响应数据WebSocket::WebSocketEventHandler::OnDataFrame

发送mojom消息:OnDataFrame 给render进程【ID=17796 】

10)、render进程【ID=17796 】收到OnDataFrame mojom消息之后在 WebSocketChannelImpl::OnDataFrame里面处理。
11)、WebSocketChannelImpl::OnDataFrame之后将数据返回给前端:

ws.onmessage = function (evt)

{

var received_msg = evt.data;

alert("数据已接收...");

};

总结:至此分析完毕:更多细节参考源码。

相关推荐
00后程序员张10 分钟前
Fiddler抓包工具使用教程,代理设置与调试方法实战解析(含配置技巧)
前端·测试工具·ios·小程序·fiddler·uni-app·webview
2301_768350236 小时前
Vue第二期:组件及组件化和组件的生命周期
前端·javascript·vue.js
wuxuanok6 小时前
WebSocket —— 在线聊天室
网络·websocket·网络协议
华洛7 小时前
公开一个AI产品的商业逻辑与设计方案——AI带来的涂色卡自由
前端·后端·产品
明远湖之鱼7 小时前
opentype.js 使用与文字渲染
前端·svg·字体
90后的晨仔8 小时前
Vue 3 组合式函数(Composables)全面解析:从原理到实战
前端·vue.js
今天头发还在吗8 小时前
【React】动态SVG连接线实现:图片与按钮的可视化映射
前端·javascript·react.js·typescript·前端框架
小刘不知道叫啥8 小时前
React 源码揭秘 | suspense 和 unwind流程
前端·javascript·react.js
szial8 小时前
为什么 React 推荐 “不可变更新”:深入理解 React 的核心设计理念
前端·react.js·前端框架
mapbar_front8 小时前
面试是一门学问
前端·面试