第六章 应用层

6.1 应用层概述

应用层是计算机网络分层模型中的最高层,它负责处理网络应用程序和用户之间的交互,为用户提供各种服务和功能。在OSI模型中,应用层是第七层,包括各种网络应用程序和协议,如电子邮件、文件传输协议(FTP)、域名系统(DNS)、超文本传输协议(HTTP)、简单邮件传输协议(SMTP)等。
应用层的主要功能包括:

  1. 提供各种网络服务和应用程序,如电子邮件、文件传输、远程登录、万维网等,为用户提供便捷的通信和信息交流方式。
  2. 实现应用程序间的通信和数据传输,通过协议规定数据格式、数据传输方式和通信流程等,保证应用程序之间的互通和兼容性。
  3. 处理数据编码和解码、加密和解密等操作,保证数据传输的安全和可靠性。
  4. 提供应用程序的访问控制和身份认证功能,保证用户和应用程序的安全性和可信性。
  5. 支持网络管理和监控,通过各种管理工具和协议,对网络应用程序和服务进行管理、监控和优化。

6.2客户/服务器方式(c/s)和对等方式(P2P)

客户/服务器方式

  • 客户和服务器是指通信中所涉及的两个应用进程。
  • 客户/服务器方式所描述的是进程之间服务和被服务的关系
  • 客户是服务请求方,服务器是服务提供方。
  • 服务器总是处于运行状态,并等待客户的服务请求。服务器具有固定端口号(例如HTTP服务器的默认端口号为80),而运行服务器的主机也具有固定的IP地址。
  • C/S方式是因特网上传统的、同时也是最成熟的方式,很多我们熟悉的网络应用采用的都是C/S方式。包括万维网WWW、电子邮件、文件传输FTP等。
  • 基于C/S方式的应用服务通常是服务集中型的,即应用服务集中在网络中比客户计算机少得多的服务器计算机上。
    • 由于一台服务器计算机要为多个客户机提供服务,在C/S应用中,常会出现服务器计算机跟不上众多客户机请求的情况。
    • 为此,在CS应用中,常用计算机群集(或服务器场)构建一个强大的虚拟服务器

对等(P2P)方式

  • 在P2P方式中,没有固定的服务请求者和服务提供者,分布在网络边缘各端系统中的应用进程是对等的,被称为对等方。对等方相互之间直接通信,每个对等方既是服务的请求者,又是服务的提供者。
  • 目前,在因特网上流行的P2P应用主要包括P2P文件共享、即时通信、P2P流媒体、分布式存储等
  • 基于P2P的应用是服务分散型的,因为服务不是集中在少数几个服务器计算机中,而是分散在大量对等计算机中,这些计算机并不为服务提供商所有,而是为个人控制的桌面计算机和笔记本电脑,它们通常位于住宅、校园和办公室中
  • P2P方式的最突出特性之一就是它的可扩展性。因为系统每增加一个对等方,不仅增加的是服务的请求者,同时也增加了服务的提供者,系统性能不会因规模的增大而降低
  • P2P方式具有成本上的优势,因为它通常不需要庞大的服器设施和服务器带宽。为了降低成本,服务提供商对于将P2P方式用于应用的兴趣越来越大

6.3 动态主机配置协议DHCP

DHCP作用:

  1. DHCP(Dynamic Host Configuration Protocol)是一种网络协议,它的主要作用是自动分配IP地址和其他网络参数(如子网掩码、网关、DNS服务器等)给客户端设备,使得设备能够快速地接入网络并获得有效的网络连接。
  2. DHCP协议通过服务器自动分配IP地址,避免了手动分配IP地址的繁琐和错误,同时也提高了网络管理的效率和可靠性。DHCP服务器可以动态地分配可用的IP地址,并监控地址池的使用情况,确保分配给客户端的IP地址是有效的、唯一的和未被占用的。
  3. DHCP还可以提供其他网络参数,例如子网掩码、网关、DNS服务器等。这些参数也可以自动分配给客户端设备,使得设备能够在接入网络时快速地配置相关的网络设置。

工作方式:

  • 发现(Discover):客户端设备在连接网络时,会广播DHCP发现请求,以寻找可用的DHCP服务器。
  • 提供(Offer):DHCP服务器在收到发现请求后,会向客户端设备提供可用的IP地址和其他网络参数。
  • 选择(Request):客户端设备从多个DHCP服务器提供的选项中选择其中一项,并向所选的DHCP服务器发送请求
  • 确认(Acknowledge):DHCP服务器收到客户端设备的请求后,会为其分配IP地址和其他网络参数,并发送确认响应。

在此过程中,DHCP服务器会维护一个IP地址池,用于存储可用的IP地址。当客户端设备请求IP地址时,DHCP服务器会从池中选择一个未被分配的IP地址,并为客户端分配该IP地址,同时也分配其他相关的网络参数,如子网掩码、网关、DNS服务器等。
DHCP还支持地址租约机制,即为分配的IP地址设定一个租约时间,在租约到期前客户端设备需要向DHCP服务器续租。如果租约到期后客户端设备没有续租或DHCP服务器收回租约,该IP地址将被释放回地址池,可以供其他客户端设备使用。

6.4域名系统DNS

概述

DNS是互联网中的一项核心服务,它将易于记忆的域名转换为IP地址,使得用户可以使用域名访问网站,而不必记住长长的IP地址。DNS是一个分布式数据库系统,由许多DNS服务器组成,通过域名系统解析提供域名与IP地址之间的映射关系。

工作流程

  1. 用户在浏览器中输入网站的域名。
  2. 本地DNS解析器会向本地DNS服务器发送一条DNS查询请求,该请求包含所需域名和查询类型(如A记录、CNAME记录等)。
  3. 如果本地DNS服务器缓存了该域名对应的IP地址,则直接返回该IP地址;否则本地DNS服务器将向根DNS服务器发送查询请求。
  4. 根DNS服务器将返回包含顶级域(如.com、.org、.cn等)DNS服务器的IP地址的响应。
  5. 本地DNS服务器将向顶级域DNS服务器发送查询请求。
  6. 顶级域DNS服务器将返回次级域DNS服务器的IP地址的响应。
  7. 本地DNS服务器将向次级域DNS服务器发送查询请求。
  8. 次级域DNS服务器将返回目标域名对应的IP地址的响应。
  9. 本地DNS服务器将该IP地址返回给用户的DNS解析器。
  10. 用户的DNS解析器将该IP地址返回给用户的浏览器。
  11. 用户的浏览器将该IP地址用于向目标网站发送请求。

6.5 文件传输协议FTP

工作流程

  1. 建立连接:FTP客户端与FTP服务器之间通过TCP/IP协议进行通信,FTP客户端通过TCP的21端口连接到FTP服务器。连接建立后,客户端可以使用FTP服务器提供的服务。
  2. 登录认证:FTP服务器会要求客户端提供用户名和密码进行身份验证。如果认证成功,客户端可以开始上传或下载文件。
  3. 传输文件:客户端与服务器之间的文件传输可以使用两种模式:ASCII模式和二进制模式。ASCII模式用于传输文本文件,二进制模式用于传输二进制文件(例如图像或视频文件)。在传输文件时,客户端可以使用FTP命令来浏览文件系统、创建文件夹、删除文件等。
  4. 断开连接:当完成文件传输后,客户端可以通过FTP命令断开与FTP服务器的连接。
    FTP客户和服务器之间要建立“控制连接”和“数据连接”这两个并行的TCP连接。控制连接在整个会话期间都保持打开状态,而数据连接在每次文件传输时才建立,传输结束就关闭。
    默认情況下,FTP使用TCP 21端口进行控制连接,TCP 20端口进行数据连接

FTP客户和服务器之间要建立“控制连接”和“数据连接”这两个并行的TCP连接。控制连接在整个会话期间都保持打开状态,而数据连接在每次文件传输时才建立,传输结束就关闭。
默认情況下,FTP使用TCP 21端口进行控制连接,TCP 20端口进行数据连接
但是,是否使用TCP20端口建立数据连接与传输模式有关,主动方式使用TCP20端口,被动方式由服务器和客户端自行协商决定。但是,是否使用TCP20端口建立数据连接与传输模式有关,主动方式使用TCP20端口,被动方式由服务器和客户端自行协商决定。

6.6 电子邮件

电子邮件传输协议SMTP工作原理

  1. 发送方通过SMTP客户端连接到自己的SMTP服务器。
  2. 发送方通过SMTP客户端将邮件发送到SMTP服务器。
  3. SMTP服务器对邮件进行地址解析,确定该邮件应该传输到哪个接收方的SMTP服务器。
  4. 发送方的SMTP服务器连接到接收方的SMTP服务器,发送邮件并等待确认。
  5. 接收方的SMTP服务器将邮件存储在本地邮件系统中,并通过POP3或IMAP协议将邮件传递给接收方的电子邮件客户端。

SMTP协议只负责将邮件从发送方传输到接收方的SMTP服务器。传输完成后,电子邮件的内容可能需要使用其他协议(例如POP3或IMAP)进行接收和处理。另外,由于SMTP是明文协议,邮件内容可能会被窃听和篡改,因此建议使用TLS或SSL等加密协议来保护电子邮件的安全性。

本文转载于网络 如有侵权请联系删除

相关文章

  • 设计模式—— 八 :工厂方法模式

    工厂方法模式是使用频率非常高的设计模式,在日常开发经常可以见到。什么是工厂方法模式?工厂方法模式的定义:Defineaninterfaceforcreatinganobject,butletsubclassesdecidewhichclasstoinstantiate.FactoryMethodletsaclassdeferinstantiationtosubclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)工厂方法模式的通用类图如图8-1所示:图8-1:工厂方法模式通用类图在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。工厂方法模式的扩展比较多,以下是比较通用的工厂方法模式实例:抽象产品类:publicabstractclassProduct{ //产品类的公共方法 publicvoidmethod1(){ //业务逻辑处理 } //抽象方法 publi

  • MySQL 学习经验、学习资源的分享

    前言:村民由于工作需要补一下MySQL,本篇就分享一下自己的学习经验以及一些资料(村民知道自己一直在鸽)。1.学习分享本来村民也是打算写一写基础教程的,但是B站UP主高新强的系列视频——MySQL8零基础入门视频教程十分照顾初学者,正适合新手村。村民看下来之后觉得很不错,视频内容比较全面,分P目录详细,示范操作讲解细致,因此就推荐给大家,但村民也会根据自己的实际需求按照视频的分P标题写一点分享,大家在观看视频的时候可以把村民的教程放在一边进行对照。下载安装MySQL8.0免费开源,可以直接从官网下载离线安装包进行安装。在安装过程中我们需要注意的是进行自定义安装,只安装服务器服务即可,否则会安装上一些我们在使用中不太需要的东西,这点在视频中也有强调。上图是安装过程中选择加密方式的截图,在MySQL8.0中更新了加密方式,在这里提及是因为后面视频会有所涉及,同时也会影响到可视化工具Navicat连接数据库。第一种加密方式(caching_sha2_password)是MySQL8.0新增的,而第二种(mysql_native_passowrd)是MySQL5.X版本中使用的,具体的作为新手

  • 如何使用百度翻译接口实现多语言网站

    在网站开发过程中,有的需求可能是要求多语言开发,涉及多个国家的语言,那么怎么实现功能和需求呢?首先我们将网站内容拆分为两类,动态数据和静态描述,什么是动态数据呢?什么是静态描述呢?接下来我说下个人的见解。一、动态数据动态数据顾名思义就是依据用户或后台管理人员进行发布、修改、操作的,比如网站的名称、版权、菜单(栏目)及个人的资料等等。这些数据需要由后端进行查询处理,返回或传递给前端,由前端渲染页面或绑定数据。二、静态描述静态描述意为程序员在页面代码(模板)中写入的内容,比如个人中心栏目比较常见的修改资料功能,假设个人信息包含以下字段:姓名、年龄、电话、邮箱、住址等等,那么在修改内容的form表单中,我们会将上述几项全部写在页面代码中,而用户的信息将由后端返回。 三、开发模式我们以thinkphp框架为例,此方式不关乎thinkphp版本,在3.2-5.1版本中均使用,我们将静态描述使用thinkphp内置的语言类“Lang”,关于此类的描述及基本使用不说了,直接看官方手册即可。动态数据由后端进行处理后返回至前端。后端对数据可使用缓存或使用分表模式,均为缓存+翻译+数据模式进行开发。缓存可

  • 在Ubuntu上以精灵进程daemon process的方式启动一个命令

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。https://jerry.blog.csdn.net/article/details/89677427首先我们使用start-stop-daemon--help来查看这个命令的帮助文档:-S的意思是start -b的意思是后台运行-C:不要关闭任何文件描述符:start-stop-daemon-SbCv-xhttp-server./koifiles或者用screen命令也行

  • 深度学习 基本概念

    理解这25个概念,你的「深度学习」才算入门!http://www.sohu.com/a/142551924_390227深度学习入门必须理解这25个概念https://blog.csdn.net/pangjiuzala/article/details/72630166了解深度学习什么是深度学习?定义一个深度学习模型,通常需要解决3个问题: 1)激活函数,也就是先对于输入神经元的激活值。一般的有logistic、tanh、以及ReLU。 2)代价函数。一般学习过程都是优化问题。代价函数一般采用欧式距离。 3)优化策略。最简单的用梯度下降。 深度学习DeepLearning(01)_CNN卷积神经网络卷积人工智能、机器学习和深度学习的区别?神经网络https://www.bilibili.com/video/av15997678/?p=9训练时,若判断错误,则激活的神经元变得不那么敏感,没激活的神经元更敏感。在隐藏层只有两三层时,激活函数影响不大。当隐藏层多的时候,激活函数要慎重选择,选择错误会造成梯度爆炸/梯度消失在卷积神经网络中,推荐relu各种优化方法http://www.sohu.

  • 限时免费 GoodSync 10 同步工具【转】

    一款不错的软件,正在开发本身的云盘,要是能够云执行任务就更好了!GoodSync10是一种简单和可靠的文件备份和文件同步软件。它会自动分析、同步,并备份您的电子邮件、珍贵的家庭照片、联系人,、MP3歌曲,财务文件和其他重要文件本地-之间的台式机,笔记本电脑,服务器,外部驱动器,以及WindowsMobile设备,以及通过FTP远程,网友的WebDAV等等。再也不会遗失您的电子邮件,照片,MP3等..GoodSync文件同步软件结合防弹可靠性与一个极其简单易用的界面比较,同步和备份您的电子邮件,联系人,照片时,iTunes,MP3和其他重要文件。复制1.自动同步或备份多种设备复制自动同步和备份您的重要文件之间的台式机,笔记本电脑,服务器和外部驱动器通过网络或互联网。用创新的同步算法-GoodSync文件同步软件是今后几年的包时,文件同步。2.轻松和自动。复制让您的文件备份和最新的一次点击,消除信息混乱,而且最重要的开始享受您的安心,知道您的财务文件,工作文件,电子邮件,联系人,照片时,iTunes,MP3和其他数据同步和备份。支持的云存储服务:Google云端硬盘亚马逊云端硬盘亚马逊S3

  • Android Spannable / 富文本的多样式使用

    1.Spannable/富文本的用途  丰富AndroidTextView的表现形式,如修改同一主体中某一部分文字的颜色、大小、样式、添加超链接以及添加图标,使得TextView功能与表现形式更强大!以下为笔者部分实现,更多请→  Google官方资料2.Spannable/富文本的实现  1. ForegroundColorSpan 修改前景色    2.RelativeSizeSpan修改文字大小(相对)    3.StyleSpan修改字体风格    4.StrikethroughSpan/UnderlineSpan 添加中划线、下划线    5.ImageSpan添加图标  6.SuperscriptSpan/SubscriptSpan 添加上、下标    7.URLSpan添加超链接

  • 使用jquary和javascript动态添加tr

    使用js添加首先拿到json解析过的json对象,比如,varobj=eval(data);因为data可能存放的是对象, 这里就假设是对象。根据对象里面的属性,添加几个td。for(varindexinobj){ varmode=obj[index];//取出数组中的对象 //创建一个row //tb是我获取的HTML的一个tbody varrow=tb.insertRow(index); varcell=row.insertCell(0); cell.innerHTML=mode.pid; cell=row.insertCell(1); cell.innerHTML=mode.pname; cell=row.insertCell(2); cell.innerHTML=mode.ptype; cell=row.insertCell(3); cell.innerHTML=mode.price; varimg=document.createElement("img"); img.setAttribute("src",mode.picon); i

  • kubernetes 安装配置 kube-ui

    接上文:在centos7上安装和配置Kubernetes下载kube-ui镜像并导入谷歌的镜像地址被墙了,无法pull拉取镜像,只能手动下载。 在每个minion上导入镜像:复制dockerloadkube-ui_v3.tar复制创建kube-systemnamespace创建kube-system.json,内容如下:复制#vimkube-system.json { "kind":"Namespace", "apiVersion":"v1", "metadata":{ "name":"kube-system" } }复制运行以下命令创建namespace复制#kubectlcreate-fkube-system.json #kubectlgetnamespace NAMELABELSSTATUS defaultnoneActive kube-systemnoneActive复制创建rc创建kube-ui-rc.yaml文件,并写入一下内容复制#

  • 有了它,图片放大100倍不是梦

    随时图片识别技术的快速发展,以前很多不能实现的技术都已变成了现实。比如模糊图片变成高清图,小图放大变清晰等等。今天给大家带来一个在线放大图片的网站,它使用最新人工智能深度学习技术–深度卷积神经网络(DeepConvolutionalNeuralNetworks),将噪点和锯齿的部分进行补充,生成新的图实现图片的无损放大。非常神奇大概比五八同城还神奇吧?•在微信公众号:小白课代表后台回复『051』或『放大』获取下载链接。效果图使用帮助:①首先打开网站,点击选择文件②选择好文件以后点击开始,放大的图片大小需要<10M,尺寸需要<3000×3000PX。③对图片类型、放大倍数、降噪程度进行选择。缺点是放大倍数最大为4倍,8倍和16倍需要升级会员。emmmm不过放大4倍以后再放大4倍不就是16倍了吗???

  • Mysql慢查询操作梳理

    Mysql慢查询解释 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表;慢查询日志用于记录一些过慢的查询语句,可以帮助管理员分析问题所在,该日志默认是没有开启的,需要在配置文件里添加一系列参数来手动启动开启Mysql慢查询的理由 数据库是很容易产生瓶颈的地方,现在Nosql大家讨论这么热,估计都被数据库搞郁闷了。MySQL中最影响速度的就是那些查询非常慢的语句,这些慢的语句,可能是写的不够合理或者是大数据下多表的联合查询等等,所以我们要找出这些语句,分析原因,加以优化。这也是发这篇博文的原因开启mysql慢查询方法 1)方法一:登陆mysql数

  • 稳定dns服务器,国内DNS服务器推荐 选对了让你网速开挂

    大家好,又见面了,我是你们的朋友全栈君。 有个小伙伴看了一则美国服务商声称自己的DNS(1.1.1.1)是互联网最快的公共服务的新闻后,询问小编是不是真的要比国内常用的DNS或者说运营商自动分配的DNS服务要厉害很多?针对这个问题,先和大家聊一下什么是DNS吧。DNS(DomainNameSystem)简单点来说,就是用来翻译网站IP的一种工具,让大家不用在浏览器中输入每个网站的IP地址(也就是XXX.XXX.XXX.XXX),直接用www.XXX.com就行了。好的DNS服务翻译的速度比较快,我们浏览起来也就没有障碍了。至于上面所说的1.1.1.1的DNS服务是不是最快,或者说是不是最适合我们的?有个非常简单的测试方法,大家打开命令提示符,输入ping1.1.1.1-t就知道结果了。看看一堆请求超时的字样,明显那个服务是只能说在美国最快,而不是在我们这边也能达到同样的效果。那我们应该怎么选择适合自己的DNS服务加快自己上网速度呢?不想使用运营商提供的DNS的话,就手动在网卡上进行设置下,填入国内常见的DNS服务。不过在手动之前,一定要使用上面的ping命令测试下哦,国内南电信被联通(

  • 【2015上半年总结】js开源组件开发系列索引

    js开源组件开发系列一索引                         2015.8by 田想兵 个人网站  从3月份进入新公司以来,时经五个月,我以平均每周1个小组件的速度,已经完成的js组件有22个之余了,已基本上全部用到实际项目中,这些小而简的组件,已能基本支持现在项目中所会遇到的前端功能性需求,所以在这里,把它们列出来,后面可能还会有一些更新: 1.日历组件(可多选)                 源码git:https://github.com/tianxiangbing/calendar       demo:http://www.lovewebgames.com/jsmodule/calendar.html 2.dialog对话框弹层            源码git:https://github.com/tianxiangbing/dialog     demo:http://www.lovewebgames.com/jsmodule/dialog.html 3.手

  • nginx 多域名跨域

    当浏览器发起ajax请求到其他域名时,会出现跨域的问题,在nginx上的解决方案是配置Access-Control-Allow-Origin来解决,此参数只允许配置单个域名或者*,当我们需要允许多个域名跨域访问时却不好配置,可以用map来实现 map$http_origin$corsHost{ default0; "~http://www.123admin.com"http://www.123admin.com; "~http://m.123admin.com"http://m.123admin.com; "~http://wap.123admin.com"http://wap.123admin.com; } server { listen80; server_namesearch.123admin.com; root/nginx; location/ { add_headerAccess-Control-Allow-Origin$corsHost; } }  add_headerAccess-Control-Allow-Origin*;复制 location/{i

  • Java 数组

      publicclassTestArray{ publicstaticvoidmain(String[]args){ //错误 //int[3]a;//数组本身是一个对象不可以在对象声明的时候指定长度 int[]a=newint[3];//在数组初始化的时候需要执行长度或者给定初始值 int[]a1={1,2,4}; int[]b=newint[]{1,2,3}; //错误不允许同时静态初始化和动态初始 //int[]b=newint[3]{1,2,3}; //错误 //int[]c; //c={1,2,3}; int[]c; c=newint[3]; c=newint[]{1,2,3}; intlen=3; int[]d=newint[len];//可以用变量声明长度 } }复制   arr.length//表示数组的长度,而不是数组的元素个数复制  

  • 123

    如果集合V在向量求和(+:V×V→V)和标量乘法(·:R×V→V)下是闭合的,则称其为域R上的线性空间或向量空间 即αv1+βv2∈V∀v1,v2∈Ⅴ、∀α,β∈R。 关于加法(+),它形成一个交换群(存在中性元素0,逆元素-v)。标量乘法尊重R的结构:α(βu)=(αβ)u。乘法和加法遵守分配律:(α+β)v=αv+βv且 α(v+u)=αv+αu: 例⼦: V=Rn,v=(x1,……, xn)T  向量空间V的子集W⊂V称为子空间,如果0∈ W和W在+和·下闭合(对于所有α∈R)。   一组向量S={v1,……,vk}⊂V的张成子空间,是由这些向量的所有线性组合形成的子空间: span(S)=(v2Vv=Xi=k1αivi) 如果满足以下条件,则称集合S线性无关: αivi=0)αi=08i; 换句话说:任何一个向量都不能表示为剩余向量的线性组合。否则该集合称为线性相关。 如果一组向量B是线性无关的并且跨越向量空间V,则称为V的基。基是线性无关向量的最大集合。   设B和B'是线性空间V的两个底。1B

  • 第10课-队列、使用多线程和队列的爬虫案例

    1、队列代码示例 importthreading importtime fromqueueimportQueue ''' Queue是线程安全的队列 ''' defset_data(q): index=0 whileTrue: q.put(index) index+=1 time.sleep(3) defget_data(q): whileTrue: print(q.get()) if__name__=='__main__': q=Queue(4) t1=threading.Thread(target=set_data,args=[q]) t2=threading.Thread(target=get_data,args=[q]) t1.start() t2.start() q=Queue(1) q.put(1) q.get(timeout=1) print(q.empty()) print(q.full(timeout=1)) print(q.qsize()) 复制 2、斗图爬虫实战 importrequests importthreading fromqueueimport

  • 判断点是否在矩形框、多边形内

    采用下面两个方法可以简单判断矩形框、多边形是否包含某个点。      ///<summary> ///判断点是否在矩形框内 ///</summary> ///<paramname="pt"></param> ///<paramname="rect"></param> ///<returns></returns> publicstaticboolPtInRect(Pointpt,RectangleFrect) { GraphicsPathpath=newGraphicsPath(); Regionregion=newRegion(); path.Reset(); //构建多边形 path.AddRectangle(rect); region.MakeEmpty(); region.Union(path); //判断点是否在多边形里 boolrlt=region.IsVisible(pt); region.Dispose(); path.Dispose(); returnrlt; } ///&

  • N皇后问题

    N皇后问题是比较典型的回溯法问题,不过在回溯法中,解决N皇后问题算是有一些难度的了。 网上有很多该问题的解法,我这个虽然不是抄来的,性能也不算彪悍,但相比之下,我对“机长出品”的可读性还是很有信心的。所以捞点儿干货贴在这里,以备将来查阅之需。 回溯法的本质是对树形结构的遍历,一层一层递进,保留符合条件的节点。到达终点后,随着递归的一层层退出,抹掉上一次遍历时留下的痕迹,从而开始下一轮遍历。 回溯法一般都会结合递归来实现,递归可以简化多层嵌套for循环的场景。但写递归函数时一定要把子问题逻辑捋清楚,并确保退出条件生效。也就是说,每经过一次递归操作,退出条件中的变量一定要有所变化,否则就是递得进去,归不出来了。递归虽然能够简化多层嵌套循环,但并没有改变其本质,因此并不是说递归一定比for循环效率高,避免无效遍历是提升循环效率的一个主要套路。 在N皇后问题中,树的每个节点都代表一个N×N大小的棋盘,棋盘上记录了该节点所有直系父级节点里皇后所在的位置,而每个皇后所在的位置必须保证以该位置为中心点画出的“米”字每一笔延伸到棋盘边缘都不会经过另一个皇后。其实,琢磨透了这点儿区别,N皇后问题和一般的

  • 背包方案问题

    博客园 首页 新随笔 联系 订阅 管理 随笔-766 文章-1 评论-107 八.背包问题方案总数   八.背包问题方案总数        对于一个给定了背包容量、物品费用、物品间相互关系(分组、依赖等)的背包问题,除了再给定每个物品的价值后求可得到的最大价值外,还可以得到装满背包或将背包装至某一指定容量的方案总数。   对于这类改变问法的问题,一般只需将状态转移方程中的max改成sum即可。例如若每件物品均是01背包中的物品,转移方程即为f[i][v]=sum{f[i-1][v],f[i-1][v-w[i]]+c[i]},初始条件f[0][0]=1。   事实上,这样做可行的原因在于状态转移方程已经考察了所有可能的背包组成方案。 货币系统 【问题描述】   给你一个n种面值的货币系统,求组成面值为m的货币有多少种方案。样例:设n=3,m=10,要求输入和输出的格式如下: 【样例输入】money.in 3 10     

  • 3、LCD实验

    隔一秒闪烁例程(引脚输出控制)   控制P1_0引脚上的LED每隔1s闪烁一次,其中P1DIR用来设置P1的8个端口的每个的输入输出方向         #include<ioCC2530.h> typedefunsignedcharuchar; typedefunsignedintuint; #defineLED1P1_0//定义P1.0口为LED1控制端 voidDelayMS(uintmsec)//毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确) { uinti,j; for(i=0;i<msec;i++) for(j=0;j<535;j++); } voidInitLed(void) { P1SEL&=~0x01;//P1.0定义为通用IO P1DIR|=0x01;//P1.0定义为输出口 } voidmain(void) { InitLed();//设置LED灯相应的IO口 while(1)//死循环 { LED1=0;//点亮LED1 DelayMS(1000);//延时1秒 LED1=1;//LED1熄灭

相关推荐

推荐阅读