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

};

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

相关推荐
Csvn9 小时前
WASM
前端
修己xj10 小时前
我用 AI 给自己写了一个 Markdown 编辑器,然后把它开源了
前端
FRing0310 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
幸运小猿11 小时前
模拟慢上传-处理超时重试image 丢失线上问题
前端·javascript·html
moshuying12 小时前
网购能买Token了!
前端
h_654321012 小时前
echarts实现柱状图加一条横线
前端·echarts
风骏时光牛马12 小时前
生成一个后端标题,只需要一个标题,不需要其他的任何文本。
前端
子非鱼@Itfuture12 小时前
关于前后端联调中登录状态/登录信息失效?
java·前端
郭小李12 小时前
openFeign入门
java·开发语言·前端
馒头不想说话13 小时前
AI当运营,帮你省人力
前端