# hack_cdn **Repository Path**: gaogaolater/hack_cdn ## Basic Information - **Project Name**: hack_cdn - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-20 - **Last Updated**: 2021-03-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HACK P2P CDN ## 环境 ## - Node.js & webRTC ## 安装依赖 ## $ cnpm install & npm install & yarn install ## 目录结构 ## ``` js . ├── package.json # 项目配置 ├── README.md # 项目说明 ├── .gitignore # GIT提交忽略文件配置 ├── src # 源码目录 │ ├── main.js # 客户端主程序,包含通信建立和页面选男人 │ └── lib/ │ ├── adapter.js # webRTC兼容 │ └── d3.js # 图片渲染 └── server.js # 服务端程序,包括通信服务和数据分发 ``` ## 开发 ## $ node servere.js ## 附加说明 ## *Server.js* 包含用于定义我们的信令服务器的代码,该代码使客户端能够来回传递消息。该服务器主要用于告诉客户端何时何地打开数据通道。在此服务器中,我们声明一个名为rtc的对象,以跟踪房间,每个房间中的客户端以及每个客户端下载内容的状态。每当客户端连接时,服务器都会遵循严格的算法: * 连接时,客户端代码将用户放置在随机的房间中。如果客户端被放置在尚未创建的房间中,我们将在rtc中构造一个房间对象,并将新加入的套接字添加到房间数组中。如果这个房间已经存在,我们将其放置在rtc中。 * 每个房间对象内存在两个数组:一个用于跟踪每个连接的客户端,另一个用于记住已成功下载页面资源并因此能够上载资源的每个连接的客户端。如果后者是非空的,则从该数组中选择一个随机的创始者,并将其与新加入的客户端配对。客户端代码就可以处理资源的上载和下载。如果创始者数组确实为空,则我们需要从服务器下载页面的资源,因为别的地方找不到资源。 * 一旦这个新加入的客户端成功下载了页面的资源,我们就将客户端的套接字ID添加到我们的room对象中的创始者数组中,表明该客户端可以为新客户端提供页面资源。 信令服务器还处理同级连接,下载资源然后从页面断开连接的情况: * 当用户从页面断开连接时,我们将使用rtc对象遍历每个房间,并删除该用户的套接字ID。 * 服务端向客户端代码发出一条消息,该消息将清理数据通道,对等连接等。 *Main.js* 包含我们CDN功能的内容,在此代码中,我们处理房间建立,服务器卸载,浏览器兼容性检查,对等连接的构建,客户端断开连接,d3可视化,数据上传和下载。 房间设置: * 当用户连接网站时,我们会立即生成一个随机令牌并将其放置在用户的URL中(当前为1到3)。该令牌表示该客户端将连接到的网络,用户仅在同一房间内的客户端之间可以进行资源调用 * 在没有webRTC或者用户第一次进入房间时从网络获取资源 * 在两个对等方之间打开数据通道后,发送方会将数据分批处理为64 Kb块(WebRTC数据通道的最大负载),并将这些数据包通过已建立的数据通道传递。最后将这些数据写入canvas,最后在节目展示图片资源