精华内容
下载资源
问答
  • 而这两个项目的灵感都是来源于万尼瓦尔·布什在其1945年的论文《和我们想得一样》中为微缩胶片设计的“记忆延伸”(memex)系统。 蒂姆·伯纳斯-李的另一个才华横溢的突破是将超文本嫁接到因特网上。在他的书《编织...
  • 1.有一个程序Demo,程序结构 客户端是WEB写的,服务端是用C++写的,WEB客户端刷新或者关闭浏览器,除了使用心跳包 WEB客户端是如何通知服务端Socket连接关闭的呢,位兄台有类似的经验还请赐教呢. 2.与第一个问题相关联...
  • 本篇从基于TCP/IP协议出发,探讨现代流行的应对高并发请求网络服务端设计架构;1. TCP/IP 模型首先回顾一下TCP/IP模型,并知道各个层次在操作系统...OSI模型的顶上三层被合并一层,称为应用层,这就是web客户(浏览器

     

     

     

            本篇从基于TCP/IP协议出发,探讨现代流行的应对高并发请求网络服务端设计架构;

    1. TCP/IP 模型

    首先回顾一下TCP/IP模型,并知道各个层次在操作系统的哪一个层次; 

       看上图,OSI模型的底下两层是随系统提供的设备驱动程序和网络硬件。通常情况下,除需知道数据链路的某些特性外,我们不用关心这两层的情况。网络层由IPv4和IPv6两个协议处理,可以选择的传输层有TCP或UDP。OSI模型的顶上三层被合并为一层,称为应用层,这就是web客户(浏览器)、telnet客户、web服务器等都所在的层。

       可见OSI模型以传输层为分界线;套接字编程接口为应用层进入传输层的接口;也符合抽象的目的:对应用层隐藏网络协议的具体通信细节,应用层只处理具体网络应用;而底下四层(从传输层到物理层)对具体网络应用了解不多,却处理所有的通信细节:发送数据,等待确认,给无序到达的数据排序,计算并验证校验和,等等。

       其次,顶上三层通常构成所谓的用户进程,底下四层却通常作为操作系统内核的一部分提供。完全符合Unix和其他现代操作系统都提供分割用户进程和内核的机制。

    2. 基本TCP 套接字编程

       TCP:传输控制协议(Transmission Control Protocol).TCP是一个面向连接的协议,为用户进程提供可靠的全双工字节流。TCP套接字是一种流套接字(stream socket). TCP关心确认,超时和重传之类的细节。大多数网络应用程序使用TCP;

        以apache为例子;apache工作在OSI模型的应用层;我们都知道启动apache后他会监听在80端口,并通过线程池来响应每个客户请求;即来一个客户请求,从连接池那出一个线程去处理这个请求;那么apache的内部是如何针对每个请求创建套接字,然后分配一个线程的呢?

        看图2,apache服务器启动后通过创建监听套接字listensocket,通过调用bind(),listen(),accept(),让主线程监听在80端口;客户请求过来后tcp三次握手,握手成功后accept()返回一个已连接套接字connsocket,代表与所返回客户的tcp连接;然后apache从连接池里拉出一个线程,并将这个已连接套接字给这个线程,让次线程处理这个请求;请求处理完毕后关闭连接,已连接套接字相应的回收;

    注:监听套接字(listening socket)是在该tcp服务进程生命周期内一直存在。而已连接套接字代表一个和客户请求建立的一个套接字,生命周期为一次请求;

                         图2 : 基本TCP客户/服务器程序套接字函数

    注:我们的jms客户端程序也是采用主线程监听队列消息,并将收到的消息给线程池里的一个线程去处理的方式来并发处理消息;

    3. 现代并发web服务器的设计范式:

         但是apache真的是一个主线程在监听80端口么? 不是的,一个主线程监听80端口,然后将已连接套接字抛给线程池里的线程去处理,有些缺点;

         缺点如下:1. 只有一个线程监听80端口,并负责三次握手和转发已连接套接字;万一此线程挂了,整个web server就没有服务能力了,容错能力不强;

                        2. 因为connect(),accept()都是阻塞函数。所以每个客户请求来都阻塞在主线程,导致不能很好的应对并发;

         基于这些缺点;apache采用每个线程都去监听80端口,当然同一时刻,只有一个线程在监听80端口;其他线程属于空闲状态;一个客户请求过来,正在监听的线程会处理这个请求并转换为工作者线程;并让出监听者的角色,这样其他线程竞争监听者的角色,并最终有一个线程监听80端口;当一个工作线程处理完请求后,回到连接池中,又处于空闲状态;

    但是这样又有问题,如果一个客户请求过来,会导致所有的空闲线程都去竞争监听者的角色。会导致很多空闲线程一下被唤醒,并只有一个线程获得监听者角色,其他线程继续空闲(睡觉),这种大批线程从空闲状态突然被唤醒有突然又睡过去,就是惊群现象;惊群现象会导致性能下降;

         apache通过在每个accept()函数上 增加互斥锁和条件变量 来解决这个惊群问题。保证每个请求只会被一个线程刚好拿到,不会影响其他线程;

          这里详细介绍下:条件变量与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用;互斥锁提供互斥机制,条件变量提供信号机制;
         那么apache是如何利用条件变量和互斥锁来解决每次只有一个空闲线程被唤醒,并且处于监听者角色呢?
         每次一个新的客户请求过来,正在监听的线程与该请求建立连接,并变为worker工作者线程。让出监听者角色时它同时发送信号到条件变量,并释放锁。这样在空闲(idle)状态的一个线程将被唤醒并获得锁。

         也就是说:条件变量保证了其他线程在等待条件变化期间处于睡眠;互斥锁保证一次只有一个线程被唤醒;


                                                          图3 :apache 的preforking 机制

     

     

    总结:通过了解了TCP/IP编程模型。和apache的MPM、Preforking机制后,我们再去看jms消息客户端代码,memcache服务器代码,jetty,等流行的web服务器的机制就不是很难了。

                                                                                                               参考:《UNIX网络编程 卷1 :套接字联网API》

     

    展开全文
  • Web语义化标准解读

    2020-11-25 23:26:16
    文末给自己挖了坑说要聊聊Web语义化,跳票至今😂。16年第一篇用来填坑好了! 什么是语义化 <p>The Semantic Web provides a common framework that allows data to be shared and reused ...
  • 一如既往,本书提供了更多明确的见解和新的例子,来阐述基于标准的设计的核心思想,你的网站最终确定一合理的设计与开发方法。 与前版不同的是,在第3版,除了有很多的“Why”来提出问题,也提供了大量的“How...
  • 3.8 控制两个文本框只输其一 3.9 判断编辑器中是否包含特殊字符 3.10 判断文本中回车的数量 3.11 判断字符串中有多少汉字 3.12 去除字符串的前后空格 3.13 刷新时清空所有文本框 3.14 随意改变大小的文本框 3.15 ...
  • 两个例子(稍后它们会被进一步分析,因此不用担心如何了解它们的工作原理!) 想象你正在写一个 MySQL 数据库查询。可能的代码如下: 复制代码到剪贴板PHP 代码$connection = mysql_connect("localhost","fred",...
  • 3.8 控制两个文本框只输其一 3.9 判断编辑器中是否包含特殊字符 3.10 判断文本中回车的数量 3.11 判断字符串中有多少汉字 3.12 去除字符串的前后空格 3.13 刷新时清空所有文本框 3.14 随意改变大小的文本框 3.15 ...
  • 顾名思义 <em>XXX-CLI</em> 就是使用命令行生成的 <em>XXX</em> 程序。之前写过一款 基于 <em>nodeJs</em> 制作个性 <em>CLI</em> 的教程 <p><strong>如何用node开发自己的cli工具并发布到NPM </a></strong> ,...
  • (交互可同时运行于同一计算机的两个程序之间,或在不同计算机上的两个程序之间,还可简化在软盘上保存数据,拿到其他房间的计算机上) 对一个新的软件进行兼容性测试,需要考虑: 1)软件需要对种操作系统、web...

    第九章 兼容性测试

    一、兼容性测试综述

    • 配置测试定义:检查软件间是否能够正确的交互和共享信息。(交互可同时运行于同一计算机的两个程序之间,或在不同计算机上的两个程序之间,还可简化为在软盘上保存数据,拿到其他房间的计算机上)
    • 对一个新的软件进行兼容性测试,需要考虑:
      1)软件需要对哪种操作系统、web浏览器以及操作系统上的应用软件保持兼容?如果测试的软件本身是
      一个操作系统,那么要求哪些应用软件能够在其上运行?
      2)应该遵守何种定义软件之间交互的标准或者规范?
      3)软件使用何种数据与其他平台和软件交互和共享信息?

    二、平台和应用程序版本

    兼容性是一种产品特性,可以有不同程度的符合标准。软件的兼容性取决于客户的要求。

    1、向后和向前兼容
    • 向前兼容:使用软件的未来版本。
    • 向后兼容:使用软件的以前版本。
    • :并非所有软件或文件都要求向前兼容或向后兼容。这是软件设计者需决定的产品特性,而软件测试员应为检查软件向前和向后兼容性所需的测试提供相应的输入。
    2、测试多个版本的影响
    • :在开始兼容性测试任务之前,需对所有可能的软件组合等价划分,使其成为软件之间正确交互的最小有效集合。
    • 决定要选择程序的原则有:流行程度、年限、类型(绘图、文字输入、财务、数据库、通信等 )、生产厂商。
    • 软件测试员和开发小组需要决定哪些最重要,然后根据上述原则建立需要测试的软件的等价划分。

    三、标准和规范

    • 在进行实际测试中,首先应该是研究可能适用于软件或者平台的现有标准和规范。这些要求有两个层次:高级和低级。
    • 高级标准是产品普遍遵守的规则,例如外观和感觉、支持的特性等。(如果某个应用程序声称与某平台兼容,就必须遵守该平台自身的标准和规范,确保软件在操作系统上能稳定可靠的运行。)
    • 低级标准是本质细节,例如文件格式和网络通信协议等。可视为软件说明书的扩充部分。(通信协议、编程语言语法以及程序用于共享信息的任何形式都符合必须公开的标准和规范)
    • 两者都很重要,都需要测试以保证兼容。

    四、数据共享兼容性

    • 在应用程序之间共享数据实际上是增强软件的功能。
    • 兼容性极好的产品:写得好的程序支持并遵守公开标准;允许用户与其他软件轻松传输数据的程序。
    • 以下列出一些测试共享兼容性的例子:
      (1) 文件保存和文件读取是人人共知的数据共享方法。
      (2) 文件导出和文件导入是许多程序与自身以前版本、其他程序保持兼容的方式。
      (3) 剪切、复制和粘贴是程序之间无需借助磁盘传输数据的最常见的数据共享方式。
      (4) DDE(动态数据交换)、COM和OLE(对象链接和嵌入)是Windows中在两个程序之间传输数据的方式。

    五、小结

    本章介绍了兼容性测试的基本知识,书中最后总结出进行这类测试的3个要点:
    (1) 对兼容软件的所有可能选择进行等价划分,使其成为可以控制的范围。当然,项目经理要认可测试清单,并接受由于未完全测试而引起的风险。
    (2) 研究适用于测试软件的高级/低级标准和规范。把它们当做产品说明书的补充内容。
    (3) 测试软件程序之间不同的数据流动方式。其中的数据交换就是程序之间保持兼容的因素。

    六、小测试

    1、判断是非:所有软件必须进行某种程度的兼容性测试。
    错。有极少数独立使用、专用,不与任何外界打交道的软件不需要进行兼容性测试。
    但是,除此之外99%的软件都必须进行某种程度的兼容性测试。
    2、判断是非:兼容性是一种产品特性,可以有不同程度的符合标准。
    对。软件的兼容性取决于客户的要求。某个字处理程序与其竞争对手产品的文件格式不兼容或者新操作系统不支持某一游戏软件,都是正常的。软件测试员应通过确定兼容性检查的工作量大小,为兼容性测试的决定提供依据。
    3、如果受命对产品的数据文件格式进行兼容性测试,应该如何完成任务?
    研究接受测试的程序是文件是否要求符合已有的标准。如果是这样,要测试程序确实遵循这些标准。对可能读写程序文件的程序进行等价划分。设计测试文档,使其包含程序能够读写的数据类型的典型范例。测试这些文件在接受测试的程序和其他程序之间是否能正确传输。
    4、如何进行向前兼容性测试?
    向前兼容性测试不容易——对现在仍见不到的东西进行测试毕竟难以实现。解决问题的方法是,完整细致的将测试定义在可以作为标准之处,从而使该标准成为判定向前兼容性测试的手段。

    展开全文
  • pydk:Android通用(4.4 / 32 ... 对于浏览器和Android支持的Python,有两个gitter通道: //gitter.im/Wasm-Python/community 嵌入是过程的一部分,包装是另一部分:嵌入不是PyDK特有的,无论您喜欢种打包程序(Pan
  • Asp.Net生命周期与Asp.Net页的生命周期是一比较... Asp.Net应用程序生命周期以浏览器Web服务器(IIS)发送请求起点。Web服务器接收到请求时,会对所请求文件的文件扩展名进行检查,确定应该由ISAPI扩...
      Asp.Net生命周期与Asp.Net页的生命周期是一个比较重要的话题,有时可能似乎知道一些,但又说不出个所以然,而且时常把这两个概念混淆。现在也是该好好理清思路,把这两个概念搞懂。

    Asp.Net生命周期

       Asp.Net应用程序生命周期以浏览器向Web服务器(IIS)发送请求为起点。Web服务器接收到请求时,会对所请求文件的文件扩展名进行检查,确定应该由哪一个ISAPI扩展(Asp.Net是Web服务器下的一个ISAPI扩展)来处理请求,并传递给它(这里指Asp.Net)。Asp.Net处理已映射到其上的文件扩展名(.aspx,.ascx,ashx,asmx…)。

       当Asp.Net接收到应用程序中任何资源的第一个请求时,ApplicationManager这个类会创建一个应用程序域,并创建HostingEnviroment这个类的实例来提供有关应用程序的信息。

       Asp.Net会为每个请求创建并初始化核心对象(HttpContext,HttpRequest,HttpResponse)。

       Asp.Net初始化所有核心对象之后,将通过创建HttpApplication类的实例来启动应用程序,如果应用程序有Global.asax文件,则Asp.Net会创建Global.asax类的一个实例,并使用该派生类来表示应用程序。

       最后由HttpApplication管线来处理请求。

    总结

    Asp.Net生命周期大致由五大阶段构成:分别是:发出请求,接受请求,为每个请求创建核心对象,将HttpApplication对象分配给请求,由HttpApplication管线处理请求。

    应用程序域

    应用程序域是由CLR强制的一个边界,用来保证应用程序不受其他程序的影响。

    Asp.Net页面的生命周期

    Asp.Net页面运行时,此页面也会经历一个生命周期,在生命周期中将会执行一系列处理步骤。了解页面生命周期是非常重要的,因为这么做你就能够在生命周期的合适阶段编码。此外,如果你要开发自定义控件,就必须熟悉页面的生命周期,以便正确进行控件的初始化。一般来说,一个Asp.Net页面要经历下面几个阶段:

    1.浏览器提出请求

    浏览器提出请求发生在页面生命周期开始之前。浏览器请求页,Asp.Net将确定是否需要分析和编译页,或者是否可以在不运行页的情况下发送页的缓存版本。

    2.页面框架初始化 Page.Init

    Asp.Net在这个阶段开始创建页面,它产生你在.aspx页面里用标签定义的所有的控件。此外,如果页面是一次回送(POST),Asp.Net将反序列化视图状态信息并把它们应用到所有控件上。Page.Init事件被触发。

    3.用户代码初始化 Page.Load

    不管页面是Get请求还是POST请求,Page.Load事件会被触发。

    4.验证

    在验证期间,将调用所有控件的Validate方法,此方法将设置各个验证控件和页面的IsValid属性。

    5.事件处理

    在这个阶段,页面已经被完全装载且通过验证,Asp.Net将会触发在上次回发后发生的所有事件。

    6.呈现

    在呈现之前,会针对该页和所有控件保存视图状态。在呈现阶段中,会调用每个控件的Render方法。在这个阶段,页面和控件对象任然可以用,因此可以执行一些最终步骤.

    7.清除

    在这个阶段,页面开始执行清除工作,并触发Page.UnLoad事件,此时页面对象虽然还可以使用,但是最终的HTML已经被呈现且不可以修改。

     

    转载于:https://www.cnblogs.com/RookieBen/p/3330556.html

    展开全文
  • Asp.Net生命周期

    2019-10-03 08:35:59
    Asp.Net生命周期与Asp.Net页的生命周期是一比较... Asp.Net应用程序生命周期以浏览器Web服务器(IIS)发送请求起点。Web服务器接收到请求时,会对所请求文件的文件扩展名进行检查,确定应该由ISAPI扩展...
     Asp.Net生命周期与Asp.Net页的生命周期是一个比较重要的话题,有时可能似乎知道一些,但又说不出个所以然,而且时常把这两个概念混淆。现在也是该好好理清思路,把这两个概念搞懂。

    Asp.Net生命周期

       Asp.Net应用程序生命周期以浏览器向Web服务器(IIS)发送请求为起点。Web服务器接收到请求时,会对所请求文件的文件扩展名进行检查,确定应该由哪一个ISAPI扩展(Asp.Net是Web服务器下的一个ISAPI扩展)来处理请求,并传递给它(这里指Asp.Net)。Asp.Net处理已映射到其上的文件扩展名(.aspx,.ascx,ashx,asmx…)。

       当Asp.Net接收到应用程序中任何资源的第一个请求时,ApplicationManager这个类会创建一个应用程序域,并创建HostingEnviroment这个类的实例来提供有关应用程序的信息。

       Asp.Net会为每个请求创建并初始化核心对象(HttpContext,HttpRequest,HttpResponse)。

       Asp.Net初始化所有核心对象之后,将通过创建HttpApplication类的实例来启动应用程序,如果应用程序有Global.asax文件,则Asp.Net会创建Global.asax类的一个实例,并使用该派生类来表示应用程序。

       最后由HttpApplication管线来处理请求。

    总结

    Asp.Net生命周期大致由五大阶段构成:分别是:发出请求,接受请求,为每个请求创建核心对象,将HttpApplication对象分配给请求,由HttpApplication管线处理请求。

    应用程序域

    应用程序域是由CLR强制的一个边界,用来保证应用程序不受其他程序的影响。

    Asp.Net页面的生命周期

    Asp.Net页面运行时,此页面也会经历一个生命周期,在生命周期中将会执行一系列处理步骤。了解页面生命周期是非常重要的,因为这么做你就能够在生命周期的合适阶段编码。此外,如果你要开发自定义控件,就必须熟悉页面的生命周期,以便正确进行控件的初始化。一般来说,一个Asp.Net页面要经历下面几个阶段:

    1.浏览器提出请求

    浏览器提出请求发生在页面生命周期开始之前。浏览器请求页,Asp.Net将确定是否需要分析和编译页,或者是否可以在不运行页的情况下发送页的缓存版本。

    2.页面框架初始化 Page.Init

    Asp.Net在这个阶段开始创建页面,它产生你在.aspx页面里用标签定义的所有的控件。此外,如果页面是一次回送(POST),Asp.Net将反序列化视图状态信息并把它们应用到所有控件上。Page.Init事件被触发。

    3.用户代码初始化 Page.Load

    不管页面是Get请求还是POST请求,Page.Load事件会被触发。

    4.验证

    在验证期间,将调用所有控件的Validate方法,此方法将设置各个验证控件和页面的IsValid属性。

    5.事件处理

    在这个阶段,页面已经被完全装载且通过验证,Asp.Net将会触发在上次回发后发生的所有事件。

    6.呈现

    在呈现之前,会针对该页和所有控件保存视图状态。在呈现阶段中,会调用每个控件的Render方法。在这个阶段,页面和控件对象任然可以用,因此可以执行一些最终步骤.

    7.清除

    在这个阶段,页面开始执行清除工作,并触发Page.UnLoad事件,此时页面对象虽然还可以使用,但是最终的HTML已经被呈现且不可以修改。

    转载于:https://www.cnblogs.com/zhangxiaolei521/p/5814617.html

    展开全文
  • 角通天种子 使用ES6( )代替的超级简单快速入门器。 建有,捆绑 。 基于官方的 。... 在第一中,我们告诉Babel我们的应用程序应支持哪些Web浏览器。 第二阻止Babel将ES6模块转换CommonJS模块,因此w
  • 1.Web服务器(IIS和Apache)可同时存在,只要保证他们的监听端口号不同即可,如:IIS用默认的80,而将Apache的配置8080。 也可暂时让IIS停止服务,而让Apache用80。 2.在D:\apache2\Apache2\conf下的httpd.conf...
  • servlet temple

    2011-06-29 20:46:07
    其中包括两个用于所有 Servlet 的基本软件包:javax.servlet 和 javax.servlet.http。可从sun公司的Web站点下载 Java Servlet 开发工具。 下面主要介绍javax.servlet.http提供的HTTP Servlet应用编程接口。  ...
  • 抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承...
  • java-servlet-api.doc

    2009-10-13 19:34:17
    客户端程序,可以是一个Web浏览器,或者是非其他的可以连接上Internet的程序,它会访问Web服务器并发出请求。这请求被运行在Web服务器上的Servlet引擎处理,并返回响应到Servlet。Servlet通过HTTP将这响应...
  • 观看两个YouTube视频。 首先是介绍视频,其次是如何使用一些额外的安全提示进行视频录制。 这不一定是一种容易向人们解释什么需要它的产品,因此,如果您得到它,请帮助不需要的朋友。 IE:我奶奶喜欢她的浏览器会...
  • asp学习相关资料大全

    2009-03-01 14:12:05
    例如可以从web浏览器中获取用户通过HTML表单提交的信息,并在脚本中对这些信息进行处理,然后向web浏览器发送信息; (5)ASP可以使用服务器端ActiveX组建来执行各种各样的任务,例如存取数据库、发现那个Email或...
  • /user /docs /docs/upload /docs/generate (最后两个文件夹如你改名了请相应的设置其属性) ⑸ 将该目录下的zuojianli.sql导入到你的数据库; ⑹ OK!自己先测试网站是否一切正常。如正常,将网址告诉别人; ⑺ (可...
  • java 面试题 总结

    2009-09-16 08:45:34
    28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ private int j; public static ...

空空如也

空空如也

1 2 3 4 5
收藏数 82
精华内容 32
关键字:

哪两个程序为web浏览器