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

};

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

相关推荐
小飞悟6 分钟前
你以为 React 的事件很简单?错了,它暗藏玄机!
前端·javascript·面试
中微子13 分钟前
JavaScript 事件机制:捕获、冒泡与事件委托详解
前端·javascript
Whoisshutiao30 分钟前
网安-XSS-pikachu
前端·安全·网络安全
惊鸿28735 分钟前
Taro3+小程序Canvas动态生成海报和二维码分享到朋友圈
前端
做梦都在学习前端42 分钟前
发布一个monaco-editor 汉化包
前端·npm·vite
石小石Orz1 小时前
为什么推荐前端学习油猴脚本开发?
前端
珵煜ini1 小时前
wd-button组件阻止事件冒泡的
前端
炒毛豆1 小时前
vue3.4中的v-model的用法~
前端·vue.js
用户40812812003811 小时前
大文件分片上传和断点续传
前端
极客悟道1 小时前
颠覆传统虚拟化:在Docker容器中运行Windows系统的开源黑科技
前端·后端