一、连接过程继续解读-----fun33-fun37解读

完整代码如下:

    //fun33-37
console.error('fun35-37==>2332==>2332');
var q = window.MediaStream;
void 0 === q &&
"undefined" != typeof webkitMediaStream &&
(q = webkitMediaStream),
void 0 !== q &&
( "getVideoTracks" in q.prototype
|| (q.prototype.getVideoTracks = function() {
console.info('fun3537.03b==>2348==>2348');
if (!this.getTracks) return [];
var e = [];
return this.getTracks.forEach(function(n) {
-1 !== ("" + n.kind).indexOf("video") && e.push(n)
}), e
},
console.info('fun3537.04==>2357==>2357'),
q.prototype.getAudioTracks = function() {
console.info('fun3537.04==>2356==>2356');
if (!this.getTracks) return [];
var e = [];
return this.getTracks.forEach(function(n) {
-1 !== ("" + n.kind).indexOf("audio") && e.push(n)
}), e
}),
console.info('fun3537.05==>2367==>2367'),
"stop" in q.prototype || (q.prototype.stop = function() {
console.info('fun3537.05==>2367==>2367');
this.getAudioTracks().forEach(function(e) {
e.stop && e.stop()
}),
this.getVideoTracks().forEach(function(e) {
e.stop && e.stop()
})
})
),

1.1 代码段一

var q = window.MediaStream;

q是个函数,用于获取媒体数据。

1.2 代码段二

void 0 === q &&

"undefined" != typeof webkitMediaStream &&

(q = webkitMediaStream),

注:经测试,void ===q为false,所以就没必要向后执行了,实际上,webkitMediaStream也是个函数,不是undefined.

1.3 代码段三

    void 0 !== q &&

    (   console.info('fun3537.03a==>2345==>2345')&&

        "getVideoTracks" in q.prototype

        || (q.prototype.getVideoTracks = function() {

                console.info('fun3537.03b==>2348==>2348');

                if (!this.getTracks) return [];

                var e = [];

                return this.getTracks.forEach(function(n) {

                    -1 !== ("" + n.kind).indexOf("video") && e.push(n)

                }), e

           },

注:q.prototype是向对象里面添加属性的方法,如下:

因为"getVideoTracks" in q.prototype是成立的,所以,后面的函数没有走。

1.4 代码段四

console.info('fun3537.04==>2357==>2357'),

        q.prototype.getAudioTracks = function() {

            console.info('fun3537.04==>2356==>2356');

            if (!this.getTracks) return [];

            var e = [];

            return this.getTracks.forEach(function(n) {

                -1 !== ("" + n.kind).indexOf("audio") && e.push(n)

            }), e

        })

注:这个函数是紧接着上面那个函数,逗号表达式里面的。 因为"getVideoTracks" in q.prototype成立,就不走这个函数了。

1.5 代码段五

console.info('fun3537.05a==>2367==>2367'),

    "stop" in q.prototype || (q.prototype.stop = function() {

        console.info('fun3537.05b==>2367==>2367');

            this.getAudioTracks().forEach(function(e) {

                e.stop && e.stop()

            }),

            this.getVideoTracks().forEach(function(e) {

                e.stop && e.stop()

            })

        })

),

注:如果成立,就是说如果stop在q.prototype中,就不管了,如果不在就定义个函数过去。

二、连接过程继续解读-----fun38尝试理解

2.1 fun38代码整体

整体代码太多,不再展示,只能分段展示。

2.2 fun38.01

            //fun38.01

            function e() {

                var e, n, t, o = (c.appVersion, c.userAgent),

                    i = c.appName,

                    r = "" + parseFloat(c.appVersion),

                    s = parseInt(c.appVersion, 10);

                if (f) {

                    i = "Opera";

                    try {

                        r = c.userAgent.split("OPR/")[1].split(" ")[0], s = r.split(".")[0]

                    } catch (a) {

                        r = "0.0.0.0", s = 0

                    }

                } else g ? (n = o.indexOf("MSIE"), i = "IE", r = o.substring(n + 5))

                : v ? (n = o.indexOf("Chrome"), i = "Chrome", r = o.substring(n + 7))

                : p ? (n = o.indexOf("Safari"), i = "Safari", r = o.substring(n + 7),

                -1 !== (n = o.indexOf("Version")) && (r = o.substring(n + 8))) : m

                ? (n = o.indexOf("Firefox"), i = "Firefox", r = o.substring(n + 8))

                : (e = o.lastIndexOf(" ") + 1) < (n = o.lastIndexOf("/"))

                && (i = o.substring(e, n),

                    r = o.substring(n + 1),

                    i.toLowerCase() === i.toUpperCase() && (i = c.appName));

                return l && (i = "Edge", r = "" +

                parseInt(c.userAgent.match(/Edge\/(\d+).(\d+)$/)[2], 10)),

                -1 !== (t = r.indexOf(";")) && (r = r.substring(0, t)),

                -1 !== (t = r.indexOf(" ")) && (r = r.substring(0, t)),

                s = parseInt("" + r, 10),

                isNaN(s) && (r = "" + parseFloat(c.appVersion),

                s = parseInt(c.appVersion, 10)),

                {

                    fullVersion: r,

                    version: s,

                    name: i,

                    isPrivateBrowsing: !1

                }

            }

分析如下:

1)定义几个变量如下:

 var e, n, t,

o = (c.appVersion, c.userAgent),

    i = c.appName,

    r = "" + parseFloat(c.appVersion),

s = parseInt(c.appVersion, 10);

a.) e,n,t定义的值是一样的,都是未定义。如下:

b.) o = (c.appVersion, c.userAgent),

对于o来说,c.userAgent是o的最终值,哪怕为空。

注:现在的关键问题是o = (c.appVersion, c.userAgent)中c从哪里来的。

c.) i,r,s

注:i,r,s的值上面截图中已给出,不再详述。

2)代码段二

  if (f) {

    i = "Opera";

    try {

       r = c.userAgent.split("OPR/")[1].split(" ")[0], s = r.split(".")[0]

    } catch (a) {

     r = "0.0.0.0", s = 0

    }

 }

注:经打日志,f为false,从代码可知,f用于判断是不是Opera浏览器,false表示不是,true表示是。不是的话,就不走下面里的代码,直接看else即可。

3)代码段三

else g ? (n = o.indexOf("MSIE"), i = "IE", r = o.substring(n + 5))

     : v ? (n = o.indexOf("Chrome"), i = "Chrome", r = o.substring(n + 7))

       : p ? (n = o.indexOf("Safari"), i = "Safari", r = o.substring(n + 7),

1g

看g成立不成立,g为false,说明不是IE浏览器。

2g不成立

走如下:

v ? (n = o.indexOf("Chrome"), i = "Chrome", r = o.substring(n + 7))

       : p ? (n = o.indexOf("Safari"), i = "Safari", r = o.substring(n + 7)

注:v成立不成立,v成立,说明是Chrome浏览器。

webrtc底层一对一连接过程探索(三)的更多相关文章

  1. webrtc底层一对一连接过程探索(二)

    一.连接过程继续解读-----fun32解读 1.1 fun32.02 "undefined" != typeof cordova && (N = !0, D = ...

  2. webrtc初探之一对一的连接过程(一)

    说明,我研究的是muan-khan的一个github项目,针对的是chrome对chrome,也就是pc对pc的一对一,一对多通话,感兴趣的可以继续往下看. github地址:https://gith ...

  3. WebRTC 源码分析(五):安卓 P2P 连接过程和 DataChannel 使用

    从本篇起,我们将迈入新的领域:网络传输.首先我们看看 P2P 连接的建立过程,以及 DataChannel 的使用,最终我们会利用 DataChannel 实现一个 P2P 的文字聊天功能. P2P ...

  4. tcp连接过程中的三次握手和四次挥手

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手握手建立连接 @第一次握手: 建立连接是,客户端A发送SYN包到服务器B,并进入SYN_SEND状态,等待B确认. @第二次握手: 服务 ...

  5. PHP的学习--连接MySQL的三种方式

    记录一下PHP连接MySQL的三种方式. 先mock一下数据,可以执行一下sql. /*创建数据库*/ CREATE DATABASE IF NOT EXISTS `test`; /*选择数据库*/ ...

  6. Java虚拟机JVM学习03 连接过程:验证、准备、解析

    Java虚拟机JVM学习03 连接过程:验证.准备.解析 类被加载后,就进入连接阶段. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 连接阶段三个步骤:验证.准备和解析. 类 ...

  7. [网络技术][转]PPTP连接过程

    转自:http://blog.csdn.net/zhu_hit/article/details/5698958 在未来几天会总结一下PPTP的工作过程,分为以下3篇讲述. 1. PPTP连接过程: 2 ...

  8. Android IOS WebRTC 音视频开发总结(三十)-- ice协议异同

    本文主要介绍ICE与SDP交互过程中的一些知识,支持原创,文章来博客园RTC.Blacker,转载请说明出处. 用过libjingle模块的同学都知道连接过程中candidate的获取与连接流程,一边 ...

  9. iOS socket原理及连接过程详解

    连接过程图解(度娘的拿过来用)

随机推荐

  1. nagios与zabbix对比

    nagios与zabbix对比 web功能: Nagios简单直观,报警与数据都在同一页面,***.红色即为问题项.Nagios web端不要做任何配置. Zabbix监控数据与报警是分开的,查看问题 ...

  2. HashSet,LinkedHashSet,TreeSet的区别

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...

  3. jdbc、Mybatis插入数据主键回显的实现方法

    插入数据的时候,往往需要获取主键值.但是有时候主键是自增长的那么,就不太适用手动添加主键值了,此时需要一种可以回显主键参数的方法, 下面以jdbc.mybatis的实现举例 此时使用的是jdbc的话或 ...

  4. Dig out WeChat deleted chat messages on Android Phone

    As we know that WeChat will wipe deleted chat messages. That's why forensic guys could  not dig out ...

  5. 启动tomcat时,一直卡在Deploying web application directory这块的解决方案

    本来今天正常往服务器上扔一个tomcat 部署一个项目的, 最后再启动tomcat 的时候 发现项目一直都访问不了,看了一下日志: [root@iz8vbdzx7y7owm488t4d89z bin] ...

  6. 003_JS基础_面向对象基础

    3.1 对象   引入:在js中表示一个人的信息(name, gender, age)通过var申明三个变量,但是这样使用基本数据类型的变量,他们是互相独立的,没有联系:  此时就需要使用对象,对象是 ...

  7. [原创]消灭eclipse中运行启动的错误:“找不到或无法加载主类”问题

    最近一直遇到这个问题且根据网上的文章做法基本无法通过,故将自己的解决步骤记录及分享给大家. 一:环境必须要配置好. 试试在dos界面输入:java.javac 分别这两个命令是否能执行,如果都能执行恭 ...

  8. Java Enum解析【转】

    Enum用法: 1:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多 ...

  9. Linux - ubuntu读取/root/.profile时发现错误:mesg:ttyname fa

    启动ubuntu,以root用户登陆,打开命令行终端 输入命令:#vim /root/.profile 找到.profile文件中的mesg n 将其替换成tty -s && mesg ...

  10. ROM、SDRAM、RAM、DRAM、SRAM、FLASH区别

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...