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("数据已接收...");

};

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

相关推荐
红烧小肥杨9 分钟前
javaWeb项目-Springboot+vue-车辆管理系统功能介绍
java·前端·vue.js·spring boot·后端·mysql·毕业设计
weixin_4432906924 分钟前
【快速上手】使用 Vite 来创建一个 Vue 3项目
前端·javascript·vue.js
前端wchen27 分钟前
知识篇:(八)微前端架构:从零开始搭建 qiankun 并运行不同的子项目
前端·react.js·架构
半糖112244 分钟前
前端数据拷贝(浅拷贝、深拷贝)
前端
前端小芬芬1 小时前
element-plus 官方表格排序问题
前端·javascript·vue.js·elementui
哟哟耶耶1 小时前
css-背景图片全屏显示适配不同尺寸覆盖
前端·css
木子七1 小时前
Js数组&高阶函数
前端·javascript
风清扬_jd1 小时前
Chromium 中window.DOMParser接口说明c++
前端·javascript·html
云小遥2 小时前
Cornerstone3D Tools对影像进行交互(中篇)-注释类工具使用
前端·vue.js
前端斌少3 小时前
强大灵活的文件上传库:FilePond 详解
前端·vue·react