页面刷新
页面刷新即通过刷新页面来更新聊天记录,通过页面提交来发送消息。毫无疑问,这种实现是最简单的,也是效率最差的。它意味着每一次收发消息都对应了一次httprequest,而http作为应用层协议,连接代价是相当大的。
ajax
ajax可以理解为xmlhttprequest,本质与页面刷新相同,但是页面上会有很多资源文件,比如图片、css、js、flash,这些文件会随着页面刷新并且没有做浏览器端缓存的时候更新。为了接收或者发送数十字节的消息而更新可能多达数百K字节的字节文件,显然是很愚蠢的。所以使用ajax来通讯,"只"需要为消息的获取或者发送而进行请求。ajax从这一点上是优于页面刷新的。
comet/server push
ajax为每一个消息的发送和接收建立一个新的http连接,并在短暂通讯完毕以后关闭。而server push的本质是http长连接,它的思路是,让服务器和浏览器维持着一个时间跨度很长的http连接,这个http连接可能大部分时候并不需要做什么,只在有消息的时候,向浏览器写入。所以这种方式避免了建立以及关闭http连接时大量的开销,提高了资源利用率。不过server push也有它的问题,在一个web服务器上,http连接数并非没有限制,所以如果把http连接数也看作是系统资源的话,server push确实是对于此资源的极大浪费了。
comet是server push的思路上的一种改进,它在ajax和server push之间使用了一种折中的策略,在高频率的通讯过程中,comet使用http长连接。一旦通讯变得不频繁,comet便释放http连接,并在下一次通讯的时候,是情况而定,看是否需要建立http长连接。
server push在asp.net中可以通过下面的代码片段实现:
protected void Page_Load(object sender, EventArgs e) {
while (IsSessionEnd as bool) {
lock(token as object) {
Response.Write(message as string);
Response.Flush();
}
}
}
(当然,在实际编码中,as type的写法是不必要的,这里只是为了说明类型)
可以看到,在上面的代码片段中,会话结束前,Response.End()都不会被调用。
socket/tcp
在页面刷新、ajax和server push的思路里,最重要的一个共同点就是基于http。http是web的基础,然而http并不符合即时通讯系统的思想,很大程度上是由于http几个特点:
[
http是无状态的,
http是一问一答的,
http是单播的,
http是应用层协议,通讯代价很大
]
然而http的下层协议tcp/udp就很适合用来做为即时通讯系统的通讯协议。可是在web标准里,一切都是基于http的。幸运的是,我们可以通过浏览器插件的信路来完成通讯,在java applet、flash和silverlight里,都提供了socket/tcp,并且dom和flash或silverlight是可以互操作的。这就意味着,dom也可以间接的使用socket来与服务器通讯。
分享到:
相关推荐
这不是一个预先构建的 Linux 发行版,而是您从头构建发行版。虽然在不同目标系统上安装 Linux 的过程在细节上有差异,但总的原则是相同的。 本教程帮助您构建(如果您有一个合适的目标系统)一个有效的 Linux 系统...
引导自己从头开始编写一个操作系统, 一本自学的书
DIY-Deep-Learning-Workstation, 从头开始构建一个深入学习工作站 DIY-Deep-Learning-Workstation从头构建一个深度学习工作站。 本文档是为 14.04编写的,但大多数步骤也应适用于其他Ubuntu版本和leanring框架。具有...
从头开始构建数据库的一个artisan命令
使用AngularJS从头开始构建Web应用程序 基于构建Web-App-From-Scratch-With-AngularJS
mini-arm-os, 从头开始构建 ARM Cortex M 系列的最小多任务操作系统内核 构建最小的多任务操作系统内核先决条件带有STM32微控制器实现的 QEMU 。生成说明./configure --disable-werror --enable-debug --target-list...
从头开始搭建AppDemo,更多请参考博客
scoutfs是一个集群内核Linux文件系统,从头开始设计和构建,用于支持大型归档系统
全书基于“先抽象再实现”的阐述模式,每一章都介绍一个关键的硬件或软件抽象,一种实现方式以及一个实际的项目。完成这些项目所必要的计算机科学知识在本书中都有涵盖,只要求读者具备程序设计经验。本书配套的支持...
用于构建Linux从头开始系统的Docker配置
《Java Web 服务:构建与运行(影印版)》提供了对Java的API的一个全面介绍,包括针对XML Web服务的JAX-WS和针对RESTful Web服务的JAX-RS。《Java Web服务:构建与运行》通过提供混合架构概述、完整的工作代码示例...
从头开始构建前端Web应用程序是一个Codecademy Pro Intensive程序,涵盖了专业人员使用React开发Web应用程序所使用的技能。 目录 扫雷车 一个基于控制台的扫雷游戏。 要添加的功能 添加验证以确保电路板尺寸合理。 ...
角滚动间谍从头开始构建的简单,轻量级的scroll-spy伪指令。 它在元素滚动到视图或视图之外时广播事件。用法在要为其接收滚动事件的元素上添加scroll-spy属性和id 。 当元素首次滚动到视图中时,会触发一次'...
app-datepicker, 使用聚合物从头开始构建的元件 应用程序 datepicker ( 以前为 jv-datepicker ) 有关详细信息,请参阅组件页 。一个自定义的聚合物元素,从头开始提供一个基于谷歌设计的更具吸引力和丰富性的。实时...
这是我在React Rally 2016中发表的一个演讲,在那里我通过一个简化的React实现来解释它是如何工作的。 这种简化的实现被称为Dilithium。
教程:如何从头开始构建Spring Boot Web应用程序 本教程使用Oracle JDK 8,Spring Boot,Spring Data,Thymeleaf构建。 如何使用它 ? 安装JDK 8: : 安装Maven: : 克隆存储库 mvn包 java -jar target / first...
从零开始React从头开始构建React Progressive Web App 该项目是在现代Web应用程序开发中尝试多种技术的游乐场。 但是,有意地,应用程序本身根本没有任何作用。 特别感谢Udacity / Google Web专家奖学金及其始终支持...
从头开始构建一个渐进式Web应用程序 什么是PWA? PWA是基于浏览器的Web应用程序(HTML5 / CSS / JavaScript)。 通过使用最新的浏览器功能,它们实现了本机应用程序典型功能和特性,包括上面列出的所有功能。 它们...
[tutsplus] 使用 AngularJS 从头开始构建 Web 应用程序
使用epoll从头开始构建基于事件循环的微小http服务器