万丈高楼平地起,打好地基很关键(一)

本文介绍了计算机网络的基础知识,包括网络的定义、协议和分层,详细阐述了网络发展的四个阶段,重点讲解了OSI参考模型和TCP/IP模型的结构与功能,帮助读者理解网络通信的基本原理。

目录

 

一、什么是网络

1.1 计算机网络的定义

1.2 协议和分层

二、网络发展过程

2.1 第一阶段  诞生阶段(计算机终端网络)

2.2 第二阶段  形成阶段(计算机通信网络)

2.3 第三阶段  互联互通阶段(开放式的标准化计算机网络)

2.4 第四阶段  高速网络技术阶段(新一代计算网络)

三、OSI参考模型

3.1 OSI模型每层功能

3.2 OSI模型和TCP/IP模型之间的关系

四、TCP/IP模型介绍

4.1 理解TCP/IP协议的分层

4.3 物理层协议

4.4 数据链路层协议

4.5 网络层协议

4.6 传输层

4.7 应用层

4.8 网络数据封装和解封在过程


一、什么是网络

1.1 计算机网络的定义

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

1.2 协议和分层

1.2.1 什么是协议

为了使数据在网络中从源传递到目的地,网络上所有设备需要“讲”相同的“语言”,描述网络通信中“语言”规范的一组规则就是协议。

比如:两个人交谈必须使用相同的语言,如果你说汉语,他说阿拉伯语,是无法正常沟通的。

数据通信协商就是决定数据的格式和传输的一组规则或者一组惯例。

1.2.2 协议分层

为什么要分层

1、易于实现和标准化:由于采取了规范的层次结构去组织网络功能与协议,因此可以将计算机网络复杂的通信过程,划分为有序的连续动作与有序的交互过程,有利于将网络复杂的通信工作过程化解为一系列可以控制和实现的功能模块,使得复杂的计算机网络系统变得易于设计,实现和标准化

2、灵活性好:各层都可以采用最适当的技术来实现,例如某一层的实现技术发生了变化,用硬件代替了软件,只要这一层的功能与接口保持不变,实现技术的变化都并不会对其他各层以及整个系统的工作产生影响;

3、相互独立:易于实现和标准化各层独立,就可以把大问题分割成多个小问题,利于实现;

 

我们以邮局为例,理解分层:

 

 

邮局对于写信人来说是下层

运输部门对于邮局来说是下层

--下层为上层提供服务

写信人与收信人之间使用相同的语言

邮局之间的约定

 --同层次之间使用相同的协议

 

二、网络发展过程

2.1 第一阶段  诞生阶段(计算机终端网络)

时间:20世纪50年代初

以单个计算机为中心的远程联机系统,构成面向终端的计算机网络

由一台中央主计算机连接大量的地理上处于分散位置的终端。这类简单的“终端——通信线路——计算机”系统,形成了计算机网络的雏形。这样的系统除了一台中心计算机外,其余的终端设备都没有自主处理的功能。

2.2 第二阶段  形成阶段(计算机通信网络)

时间:20世纪60年代中期

背景:出现了若干个计算机互连的系统,开创了“计算机——计算机”通信的时代,呈现出多处理中心的特点

例子:IBM公司的SNA、DEC公司的DNA

缺点:各个公司推出自己的网络体系机构和相应的软、硬件产品。各自研制的网络没有统一的网络体系结构,难以实现互连。

2.3 第三阶段  互联互通阶段(开放式的标准化计算机网络)

时间:20年代80年代

国际化标准组织与1984年正式颁布了一个称为“开放系统互连基本参考模型”(Open System Interconnection Basic Reference Model)的国际标准ISO 7498。简称OSI参考模型或OSI/RM。OSI/RW由七层组成,所以也称OSI七层模型。

作用:开创了一个具有统一的网络体系结构、遵循国际标准化协议的计算机网络的新时代。大大加速了计算机网络的发展

2.4 第四阶段  高速网络技术阶段(新一代计算网络)

时间:20世纪90年代

Internet、高速通信网络技术、接入网、网络和信息安全技术的盛行

 

三、OSI参考模型

OSI(open system interconnect)模型标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。它将计算机通信过程安装功能划分为7层,并规定了每一层的功能。

OSI模型产生的过程:

 

OSI 7层模型每一层定义了不同的标准协议,通信的双方采用统一标准,确保通信正常。

 

3.1 OSI模型每层功能

  • 应用层,应用层根据互联网中需要通信的应用程序的功能,定义客户端和服务端程序通信的规范,应用层向表示层发出请求。我用嘴给你耳朵

<think>我们被要求使用Vue 3的setup语法糖(<script setup>)结合pdf.js来加载PDF文件。pdf.js是Mozilla开发的个JavaScript库,用于在网页中渲染PDF文档。 根据引用[1]和[2],我们知道有个Vue组件`VueOfficePdf`,它来自`@vue-office/pdf`,并且它利用了pdf.js。但是用户要求使用pdf.js直接,而不是通过个封装好的组件。不过,引用[4]提到了`vue-pdf-embed`,但用户明确要求使用pdf.js。 因此,我们需要自己使用pdf.js来实现。pdf.js的基本使用步骤包括: 1. 引入pdf.js库及其样式(如果需要默认的工具栏)。 2. 获取PDF文件(可以是URL、ArrayBuffer等)。 3. 使用`pdfjsLib.getDocument`加载PDF文档。 4. 逐页渲染到canvas上。 在Vue3的setup语法糖中,我们将使用组合式API。 由于pdf.js是个外部库,我们需要先安装它: ```bash npm install pdfjs-dist ``` 然后,我们将创建个Vue组件,在组件的setup中使用pdf.js。 完整示例: ```vue <template> <div> <!-- 用于显示PDF页面的容器 --> <div v-for="page in pages" :key="page.pageNumber"> <canvas :id="'canvas-' + page.pageNumber"></canvas> </div> </div> </template> <script setup> import { ref, onMounted } from 'vue'; import * as pdfjsLib from 'pdfjs-dist'; // 设置pdf.worker.js的路径,因为pdf.js使用了Web Worker来处理解析 pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@3.4.120/build/pdf.worker.min.js'; const props = defineProps({ pdfUrl: { type: String, required: true } }); const pages = ref([]); // 用于保存每页的信息 // 加载PDF并渲染 const loadPdf = async () => { try { // 加载PDF文档 const pdfDoc = await pdfjsLib.getDocument(props.pdfUrl).promise; // 清空之前的页面 pages.value = []; // 循环每页 for (let pageNum = 1; pageNum <= pdfDoc.numPages; pageNum++) { const page = await pdfDoc.getPage(pageNum); // 获取页面缩放到适合canvas的视图 const viewport = page.getViewport({ scale: 1.5 }); // 准备个canvas元素 const canvas = document.createElement('canvas'); const canvasContext = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; // 将PDF页面渲染到canvas上下文中 const renderContext = { canvasContext, viewport }; await page.render(renderContext).promise; // 将canvas数据和页面信息保存 pages.value.push({ pageNumber: pageNum, canvasData: canvas.toDataURL() // 或者我们可以直接使用canvas元素,但这里为了简单使用数据URL // 或者我们也可以不在循环中渲染到canvas,而是等挂载后再渲染,所以这里我们保存页面对象和视图大小 // 下面我们采用另种方法:在mounted之后操作DOM }); // 注意:上面的渲染方式在循环中创建了canvas,但我们没有挂载到DOM,所以需要调整。 // 实际上,我们可以在onMounted之后,使用ref来操作DOM。 } } catch (error) { console.error('Error loading PDF:', error); } }; // 在组件挂载后加载PDF onMounted(() => { loadPdf(); }); </script> ``` 但是,上面的代码在循环中创建了canvas,并且试图将每页渲染出来,但是并没有将canvas插入到DOM中。而且,我们在模板中使用了`v-for`来遍历`pages`数组,但是数组中的每项我们只是保存了数据URL,并没有使用canvas元素。 因此,我们需要调整策略:在模板中我们预先并不知道有多少页,所以我们开始不生成canvas,而是等PDF加载完成后,再动态创建canvas并插入到DOM中。但是这样不太符合Vue的响应式理念。 另种做法是,我们只保存每页的页面对象和视图大小,然后在组件的更新周期之后(使用nextTick)再进行渲染。 改进版本: 1. 我们使用个数组`pages`来保存每页的信息(包括页面对象和视图大小)。 2. 在模板中,我们根据`pages`数组生成对应数量的canvas,并给每个canvas设置个ref(数组)以便访问。 3. 使用`watch`或`onUpdated`来渲染每页,但更合适的是在获取到页面信息后,利用nextTick来确保DOM已经更新,然后进行渲染。 但是,为了简单和清晰,我们可以这样做: ```vue <template> <div> <canvas v-for="page in pages" :key="page.pageNumber" :ref="setCanvasRef"></canvas> </div> </template> <script setup> import { ref, onMounted, nextTick } from 'vue'; import * as pdfjsLib from 'pdfjs-dist'; pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@3.4.120/build/pdf.worker.min.js'; const props = defineProps({ pdfUrl: { type: String, required: true } }); const pages = ref([]); // 保存页面信息,包括page对象和viewport const canvasRefs = ref([]); // 用于保存canvas元素的引用 const setCanvasRef = (el) => { if (el) { canvasRefs.value.push(el); } }; const loadPdf = async () => { try { const pdfDoc = await pdfjsLib.getDocument(props.pdfUrl).promise; const numPages = pdfDoc.numPages; pages.value = []; // 重置页面信息 canvasRefs.value = []; // 重置refs // 获取每页的信息 for (let i = 1; i <= numPages; i++) { const page = await pdfDoc.getPage(i); const viewport = page.getViewport({ scale: 1.5 }); pages.value.push({ pageNumber: i, page, viewport }); } // 等待DOM更新(因为v-for会生成canvas) nextTick(() => { // 现在canvasRefs应该已经更新,并且长度与pages相同 // 注意:由于我们使用同个ref函数,所以顺序应该与pages数组致 pages.value.forEach((pageInfo, index) => { const canvas = canvasRefs.value[index]; if (!canvas) return; const context = canvas.getContext('2d'); canvas.height = pageInfo.viewport.height; canvas.width = pageInfo.viewport.width; // 渲染页面到canvas const renderContext = { canvasContext: context, viewport: pageInfo.viewport }; pageInfo.page.render(renderContext); }); }); } catch (error) { console.error('Error loading PDF:', error); } }; onMounted(loadPdf); </script> ``` 注意:上面的代码中,我们使用了个函数`setCanvasRef`来收集canvas元素,因为v-for中的ref会返回个数组,但是我们在setup中无法直接绑定多个ref(除非用数组ref),这里我们采用手动收集的方式。 但是,这种方法在每次更新时都会收集,可能会重复,所以我们在每次加载PDF前重置了`canvasRefs`数组。另外,由于每次加载PDF时,`pages`数组会改变,模板中的canvas会重新生成,然后触发`setCanvasRef`。 然而,上面的代码可能存在性能问题,因为每页都渲染个canvas,并且PDF页数可能很多。 另外,我们也可以使用单个容器,然后在加载完成后动态创建canvas并插入,但这样就需要直接操作DOM,不太符合Vue的响应式原则。 考虑到用户要求完整示例,我们提供第二种方法:在加载每页时,等待DOM更新,然后渲染到对应的canvas。这种方法比较直观,但可能需要在性能上做优化(比如虚拟滚动)。 另外,pdf.js还支持使用SVG渲染,但这里我们使用canvas。 最后,我们还需要注意,在组件卸载时,最好取消PDF的加载和渲染,避免内存泄漏。 由于pdf.js的渲染是异步的,我们可以提供个取消的方法?但是这里没有实现。 以上是个基本的示例,用户可以根据实际需求进行调整。 另外,如果用户需要更高级的功能(如缩放、翻页等),建议使用现有的封装库,如`vue-pdf-embed`(如引用[4]所述),但用户要求直接使用pdf.js,所以我们提供了底实现。 现在,根据要求,我们还需要生成相关问题。 §§相关问题§§ 1. 如何在Vue 3中使用pdf.js实现PDF的缩放功能? 2. 在pdf.js中,如何实现多页PDF的连续滚动? 3. 如何优化pdf.js在Vue 3中的性能(例如大型PDF)? 4. 在Vue 3中,如何使用pdf.js实现PDF文本选择和高亮? </think>以下是个在 Vue 3 中使用 Composition API (setup 语法) 通过 PDF.js 加载和渲染 PDF 的完整示例: ```vue <template> <div class="pdf-viewer"> <!-- PDF显示容器 --> <div ref="pdfContainer" class="pdf-container"></div> <!-- 控制按钮 --> <div class="controls"> <button @click="prevPage">上页</button> <span>第 {{ currentPage }} 页 / 共 {{ totalPages }} 页</span> <button @click="nextPage">下页</button> <input type="range" min="1" :max="totalPages" v-model="currentPage"> </div> </div> </template> <script setup> import { ref, onMounted, onUnmounted, watch } from 'vue'; import * as pdfjsLib from 'pdfjs-dist'; // 设置PDF.js工作线程路径(必需) pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@3.4.120/build/pdf.worker.min.js'; const props = defineProps({ pdfUrl: { type: String, required: true } }); // 响应式变量 const pdfContainer = ref(null); const pdfDoc = ref(null); const currentPage = ref(1); const totalPages = ref(0); const renderTask = ref(null); const scale = ref(1.5); // 初始缩放比例 // 加载PDF文档 const loadPdf = async () => { try { // 获取PDF文档 const loadingTask = pdfjsLib.getDocument(props.pdfUrl); pdfDoc.value = await loadingTask.promise; totalPages.value = pdfDoc.value.numPages; // 渲染第页 renderPage(currentPage.value); } catch (error) { console.error('PDF加载失败:', error); } }; // 渲染指定页面 const renderPage = async (pageNum) => { if (!pdfDoc.value) return; // 取消正在进行的渲染任务 if (renderTask.value) { renderTask.value.cancel(); } // 清空容器 pdfContainer.value.innerHTML = ''; try { // 获取页面 const page = await pdfDoc.value.getPage(pageNum); // 创建Canvas元素 const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); // 设置视图 const viewport = page.getViewport({ scale: scale.value }); canvas.height = viewport.height; canvas.width = viewport.width; // 添加到容器 pdfContainer.value.appendChild(canvas); // 渲染页面 renderTask.value = page.render({ canvasContext: context, viewport: viewport }); await renderTask.value.promise; } catch (error) { if (error.name === 'RenderingCancelledException') { console.log('渲染已取消'); } else { console.error('页面渲染失败:', error); } } }; // 导航控制 const nextPage = () => { if (currentPage.value < totalPages.value) { currentPage.value++; } }; const prevPage = () => { if (currentPage.value > 1) { currentPage.value--; } }; // 监听页码变化 watch(currentPage, (newPage) => { renderPage(newPage); }); // 组件挂载时加载PDF onMounted(() => { loadPdf(); }); // 组件卸载时清理资源 onUnmounted(() => { if (renderTask.value) { renderTask.value.cancel(); } if (pdfDoc.value) { pdfDoc.value.destroy(); } }); </script> <style scoped> .pdf-container { margin: 20px auto; border: 1px solid #ddd; overflow: auto; max-width: 100%; } .controls { display: flex; justify-content: center; align-items: center; gap: 15px; margin-top: 15px; } canvas { display: block; margin: 0 auto; } </style> ``` ### 核心实现说明: 1. **安装依赖**: ```bash npm install pdfjs-dist ``` 2. **关键功能**: - 使用 PDF.js 的 `getDocument` 加载 PDF 文件 - 通过 `getPage` 获取特定页面 - 创建 Canvas 元素并渲染 PDF 页面 - 实现分页导航和缩放控制 - 使用 Vue 的响应式系统管理状态(当前页/总页数) - 组件卸载时正确清理资源 3. **优化建议**: - 添加缩放控制:可增加 `zoomIn`/`zoomOut` 方法修改 scale 值 - 添加文本选择:启用 PDF.js 的文本渲染 - 支持旋转:使用 `getViewport` 的 rotation 参数 - 添加加载状态:在加载期间显示加载指示器 ### 引用说明: - 基于 PDF.js 核心库实现轻量级渲染 [^1] - 使用 Vue 3 Composition API 实现响应式逻辑 [^2] - 采用 Canvas 渲染确保高质量的 PDF 显示 [^1] - 通过 Props 接收 PDF 路径实现组件复用 [^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值