http相关知识

http是无状态,请求,响应模式的通信模式,就是用户每次通过浏览器点击一下页面,都需要重新与web服务器建立一下连接,且发送自己的 session id 给服务器端以使服务器端验证此用户的身份。客户端若想从web服务器上获取数据,必须主动发起一个请求,然后接收服务器端的返回,服务器端不会主动向客户端推送消息。

基于传统的web服务器只会被动响应客户端请求的这个特性,想实现web实时聊天的需求,有以下几个方式:

 

轮询(polling)

轮询,客户端向服务器发出请求以获取一些数据。为了尽快的获取服务器端事件,轮询的间隔必须尽可能的小。但是这样的缺点:

如果间隔小的话,客户端浏览器就会发出更多的请求,这些请求中的许多都不会返回任何有用的数据,而白白浪费掉带宽和资源。

 

Comet

使用轮询的ajax非常受限:其不具伸缩性,不提供低延迟通信(只要事件一到达服务器端,它们句以尽可能快的速度到达浏览器端)。

Comet是一个web应用模型,在该模型中,请求被发送到服务器端并保持一个很长的存活期,直到超时或是有服务器端事件发生。在该请求完成后,另一个长期存在的ajax请求就被发送到服务器端。

Comet的一个优点是,每个客户端始终都有一个向服务器端打开的通信链路。服务器端可以通过在事件到来时立即提交响应来把事件推给客户端,或者它甚至可以积累再连续发送。因为请求长时间保持打开的状态,故服务器端需要特别的功能来处理所有的这些长生存期请求。

Comet 的实现主要有两种方式:

基于 ajax的长轮询(long-polling)方式

浏览器发出xml HttpRequest请求,服务器端接收到请求后,会阻塞请求直到有数据或着超时才返回,浏览器js在处理请求返回信息(超时或有效数据)后再次发出请求,重新建立连接。在此期间服务器端可能已经有新的数据到达,服务器会选择把数据保存,直到重新建立连接,浏览器会把所有数据一次性取出。

Forever lframe(永存的lframe)

此技术涉及了一个置于页面中隐藏 lframe标签,该标签的src属性指向返回服务器端事件的servlet路径。每次在事件到达时,servlet写入并刷新一个新的script标签,该标签内部带有javascript代码,lframe的内容被附加上这一script标签,标签中的内容就会得到执行。

 

 

WebSocket

在新一代html标准html5中提供了一种浏览器和服务器间进行全双工通讯的网络技术WebSocket。

WebSocket是一个全新的独立的协议,基于TCP协议,与http协议兼容,却不会融入http协议,仅仅作为html5的一部分。于是脚本又被赋予了另一个能力:发起WebSocket请求。

与http协议不同的请求响应模式,WebSocket在建立连接之前有一个Handshake(Openling Handshake)过程,在关闭连接前也有一个Handshake(Closing Handshake)过程,建立连接之后,双方即可双向通信。

(遗憾的是 目前django不支持)

 

以上几种实现方式的优缺点

轮询:

客户端定时向服务器发送ajax请求,服务器接收到请求后马上返回响应信息并关闭连接

优点:后端程序编写比较容易

缺点:请求中有大半无用的,浪费带宽和服务器资源

适用于小型应用

长轮询:

客户端向服务器发送ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应并关闭连接,客户端处理完响应信息后再向服务器发送新的请求

优点:在无消息的情况下不会频繁的请求,耗费资源小

缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护

长连接:

在页面中嵌入一个隐藏iframe,将这个隐藏iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断的向客户端输入数据

优点:消息即时到达,不发无用请求;管理起来也相对方便

缺点:服务器维护一个长连接会增加开销

Flash Socket:

在页面中内嵌入一个使用scoket类的flash程序javascript通过调用此flash程序提供的socket接口与服务器端的socket接口进行通信,javascript在收到服务器端传送的消息后控制页面的显示

优点:实现真正的即时通信,而不是伪即时

缺点:客户端必须安装flash插件,非http协议,无法自动穿越防火墙

web聊天相关知识的更多相关文章

  1. 移动WEB像素相关知识

    了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...

  2. 移动WEB viewport 相关知识

    了解移动web viewport的知识,主要是为了切图时心中有数.本文主要围绕一个问题:切图时怎样设置<meta name="viewport">相关参数?围绕这个问题 ...

  3. Web缓存相关知识整理

    一.前言  工作上遇到一个这样的需求,一个H5页面在APP端,如果勾选已读状态,则下次打开该链接,会跳过此页面.用到了HTML5 的本地存储 API 中的 localStorage作为解决方案,回顾了 ...

  4. 了解Web的相关知识

    一.WWW基础 WWW(world wide web, 万维网)是Internet上基于客户端/服务器体系结构的分布式多平台的超文本超媒体信息服务系统.它利用超文本(hypertext).超媒体(hy ...

  5. web.xml相关知识摘录整理

    web.xml 中的listener. filter.servlet 加载顺序及其详解 在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人 ...

  6. WEB的相关知识总结

    JS-->OOP/Module, DOM, JSON, AJAX------------------><script>, script.js的内容 HTML/JS/CSS HT ...

  7. WEB相关知识和Tomcat服务器

    WEB相关知识 1.Internet上供外界访问的Web资源分为: 静态web资源:指web页面中供人们浏览的数据始终是不变的. 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间 ...

  8. web跨域及cookie相关知识总结

    原文:web跨域及cookie相关知识总结   之前对于跨域相关的知识一致都很零碎,正好现在的代码中用到了跨域相关的,现在来对这些知识做一个汇总整理,方便自己查看,说不定也可能对你有所帮助. 本篇主要 ...

  9. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

随机推荐

  1. .NET应用程序默认使用管理员身份打开

    1.在源码的Properties目录中找到 app.manifest(如果没有进入第二步,有跳过第二步) 2.如果没有app.manifest文件可以打开项目属性,找到安全性项,勾上启用 ClickO ...

  2. Elasticsearch-->Get Started-->Basic concepts

    https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-concepts.html There ...

  3. 【atcoder】Two Sequences [arc092 D](思维题)

    题目传送门:https://arc092.contest.atcoder.jp/tasks/arc092_b 这场arc好难啊...这场感觉不像正常的arc...其实这道题还可以更早写出来的,但是蒟蒻 ...

  4. IOS 发布被拒 PLA 1.2问题 整个过程介绍 03 个人账户升级公司账户

    根据上一篇文章,提交的邮件,苹果给我回了一封邮件 如下: 您好: 感谢您参与 Apple 开发者计划支持.我是 XXXX,非常荣幸协助您. 我们随时都可以开始将您的个人会员资格迁移到组织会员资格.首先 ...

  5. math.floor实现四舍五入

     lua math.floor 实现四舍五入: lua 中的math.floor函数是向下取整函数. math.floor(5.123) -- 5 math.floor(5.523) -- 5 用此特 ...

  6. python中的import一个注意事项

    import math def foo(): import math x = math.pi # 如果math在下面import会出错,因为import是个写的过程(添加到sys.modules中), ...

  7. ACM的输入输出总结

    关于ACM的输入输出(一) 一般来说ACM的现场赛会规定输入输出 或者是文件输入标准输出 也可能是文件输入文件输出 如果没有规定的话那么一般就是标准的输入输出了 那说一下输入输出的重定向 一般用下面两 ...

  8. numpy array或matrix的交换两行

    A[j,:] = A[maxindex,:] # 注意这样是一个很低级的错误!这样只是赋值 我们很容易想起python中的两个值交换一句搞定不用引入中间变量 a, b = b, a 但在numpy的a ...

  9. review38

    Java程序中可以存在多个线程,但是在处理多线程问题时,必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量.这时可能发生混乱. 所谓线程同步就是若干个线程都需要一个 ...

  10. ActionContext实现原理

    StrutsPrepareAndExecuteFilter [http://www.tuicool.com/articles/NVNbYn] struts2 和 struts1 的一个重要区别就是它进 ...