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. INSPIRED启示录 读书笔记 - 第27章 合理运用瀑布式开发方法

    瀑布式开发方法的基本原则 1.采用阶段式开发:软件开发过程被事先分成固定的几个阶段,撰写书面的需求说明文档.设计高层软件架构.设计低层细节.编写代码.测试.部署 2.采用阶段式评审:每个阶段结束后,对 ...

  2. Java 封装、继承、多态

    Java中使用 extends 关键字 进行父类继承 在初始化子类时,子类会自动执行父类的构造方法, 如果子类的构造方法中没有显示调用父类的构造方法, 则系统会默认调用父类无参的构造方法 super( ...

  3. C++使用命名空间中成员的三种方式

    通过简单的代码来介绍使用命名空间中成员的三种方式(我们最常用到的命名空间是是标准库std,下面的命名空间都以std为例): 使用作用域符:: #include<iostream> int ...

  4. UVA 796 连通图求桥

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=86270#problem/C#include<iostream> #inclu ...

  5. Java properties配置文件工具类

    /* * Copyright (c) 2017. Panteng.Co.Ltd All rights reserved */ import org.apache.log4j.Logger; impor ...

  6. Qt 安装事件过滤器installEventFilter

    Qt 安装事件过滤器installEventFilter (2013-01-28 14:29:18) 转载▼   分类: 工作笔记 Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他 ...

  7. Vue v-if条件渲染

    1.简单的v-if指令,代码如下 <!DOCTYPE html> <html> <head lang="en"> <meta charse ...

  8. vijos 1250 最勇敢的机器人 分组背包+并查集

    P1250最勇敢的机器人 背景 Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ 描述 机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品. 它们到了一个仓库,里面有n ...

  9. CentOS 6和CentOS 7命令区别

      From  http://www.cnblogs.com/bethal/p/5945026.html (1)桌面系统[CentOS6] GNOME 2.x[CentOS7] GNOME 3.x(G ...

  10. Qt5 窗口内的控件随窗口大小自动变化

    http://www.bubuko.com/infodetail-827151.html 讲的很详细