一、连接过程继续解读-----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. EMC题2

    易安信笔试题分享:1 protected成员函数能被肿么调用2 “has-a” relationship是指的啥,答案有instance, reference, pointer等...3 int, c ...

  2. Linux学习之XShell与虚拟机的连接

    最近在慕课网上学习Linux视频,记录一下解决问题的方法和过程. 实验软件环境: 虚拟机软件Vmware Workstation10.0.虚拟机系统CentOS 6.3(32位).XShell 5.0 ...

  3. CMD命令操作MySql数据库详解

    第一:mysql服务的启动和停止 1.  net stop mysql 2.  net start mysql 第二:登录 mysql –u用户名 [–h主机名或者IP地址] –p密码 例如:mysq ...

  4. sha1() 函数

    sha1() 函数计算字符串的 SHA-1 散列. sha1() 函数使用美国 Secure Hash 算法 1. 来自 RFC 3174 的解释 - 美国 Secure Hash 算法 1:SHA- ...

  5. APACHE服务器出现No input file specified.的完美解决方案

    转自:http://www.upupw.net/server/n53.html 启用REWRITE的伪静态功能的时候,首页可以访问,而访问内页的时候,就提示:"No input file s ...

  6. destoon_笔记

    {mb_substr($shop_type[catname],0,4)} {dsubstr($v['company'],18)} =================================== ...

  7. SSH的jar包下载地址

    spring http://repo.spring.io/libs-release-local/org/springframework/spring/ 条理清晰的搭建SSH环境之添加所需jar包 ht ...

  8. 【转】Maven pom.xml 配置详解

    原文链接:https://yq.aliyun.com/articles/38271 pom.xml文件配置详解 --声明规范 <project xmlns="http://maven. ...

  9. nginx中支持.htaccess并禁止php在特定目录无法运行

    在nginx.conf中的server里面 include /yjdata/www/thinkphp/.htaccess; 在对应的目录下面创建.htaccess,并填写以下内容,(image是跟目下 ...

  10. Django 发送邮件

    问题: 对于一些错误信息或用户注册账号的时候,需要给用户发送邮件进行验证. 以用户注册发邮件为例子,用户向后端提起注册,后端收到用户邮箱,对邮箱格式进行验证,然后发送邮件,邮件内容中包括邮件标题.邮件 ...