Python之路,Day18 - 开发一个WEB聊天来撩妹吧

Python之路,Day18 - 开发一个WEB聊天来撩妹吧

 

本节内容:css

项目实战:开发一个WEB聊天室html

功能需求:html5

  1. 用户能够与好友一对一聊天
  2. 能够搜索、添加某人为好友
  3. 用户能够搜索和添加群
  4. 每一个群有管理员能够审批用户的加群请求,群管理员能够用多个,群管理员能够删除、添加、禁言群友
  5. 能够与聊天室里的人进行临时会话(与qq群同样)
  6. 能够在群中发图片
  7. 能够与好友一对一发文件

知识必备:jquery

  1. django 
  2. html\css\js
  3. bootstrap
  4. jquery, ajax

 

 

前景介绍

首先咱们知道http是无状态、请求/响应模式的通讯模式,就是用户每次经过浏览器点击一下页面,都须要从新与WEB服务器创建一次链接,且发送本身的session id给服务器端以使服务器端验证此用户的身份。 客户端若想从web服务器上获取数据,必须主动发起一个请求,而后接收服务器端的返回,服务器端不会主动往客户端推送消息。 git

基于传统的WEB服务器只会被动响应客户端请求的这个认知,若是咱们想实现WEB实时聊天的需求,基本上只有如下几种方式:web

轮询(polling)

轮询 (Polling) 涉及了从客户端向服务器端发出请求以获取一些数据,这显然就是一个纯粹的 Ajax HTTP 请求。为了尽快地得到服务器端事件,轮询的间隔(两次请求相隔的时间)必须尽量地小。但有这样的一个缺点存在:若是间隔减少的话,客户端浏览器就会发出更多的请求,这些请求中的许多都不会返回任何有用的数据,而这将会白白地浪费掉带宽和处理资源。ajax

Comet

使用了轮询的Ajax 很是受限:其不具伸缩性,不提供低延迟通讯(只要事件一到达服务器端,它们就以尽量快的速度到达浏览器端)。 Comet 是一个 Web 应用模型,在该模型中,请求被发送到服务器端并保持一个很长的存活期,直到超时或是有服务器端事件发生。在该请求完成后,另外一个长生存期的 Ajax 请求就被送去等待另外一个服务器端事件。django

Comet 的一大优势是,每一个客户端始终都有一个向服务器端打开的通讯链路。服务器端能够经过在事件到来时当即提交(完成)响应来把事件推给客户端,或者它甚至能够累积再连续发送。由于请求长时间保持打开的状态,故服务器端须要特别的功能来处理全部的这些长生存期请求。bootstrap

 

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

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

浏览器发出XMLHttpRequest 请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才返回,浏览器JS在处理请求返回信息(超时或有效数据)后再次发出请求,从新创建链接。在此期间服务器端可能已经有新的数据到达,服务器会选择把数据保存,直到从新创建链接,浏览器会把全部数据一次性取回。

Forever Iframe(永存的 Iframe)

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

 

 

WebSocket 

若是说Ajax的出现是互联网发展的必然,那么Comet技术的出现则更多透露出一种无奈,仅仅做为一种hack技术,由于没有更好的解决方案。Comet解决的问题应该由谁来解决才是合理的呢?浏览器,html标准,仍是http标准?主角应该是谁呢?本质上讲,这涉及到数据传输方式,http协议应首当其冲,是时候改变一下这个懒惰的协议的请求/响应模式了。

W3C给出了答案,在新一代html标准html5中提供了一种浏览器和服务器间进行全双工通信的网络技术Websocket。从Websocket草案得知,Websocket是一个全新的、独立的协议,基于TCP协议,与http协议兼容、却不会融入http协议,仅仅做为html5的一部分。因而乎脚本又被赋予了另外一种能力:发起websocket请求。这种方式咱们应该很熟悉,由于Ajax就是这么作的,所不一样的是,Ajax发起的是http请求而已。 

与http协议不一样的请求/响应模式不一样,Websocket在创建链接以前有一个Handshake(Opening Handshake)过程,在关闭链接前也有一个Handshake(Closing Handshake)过程,创建链接以后,双方便可双向通讯。

 



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

轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后立刻返回响应信息并关闭链接。 
优势:后端程序编写比较容易。 
缺点:请求中有大半是无用,浪费带宽和服务器资源。 
实例:适于小型应用。


长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住链接,直到有新消息才返回响应信息并关闭链接,客户端处理完响应信息后再向服务器发送新的请求。 
优势:在无消息的状况下不会频繁的请求,耗费资源小。 
缺点:服务器hold链接会消耗资源,返回数据顺序无保证,难于管理维护。 
实例:WebQQ、Hi网页版、Facebook IM。

 

长链接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长链接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。 
优势:消息即时到达,不发无用请求;管理起来也相对方便。 
缺点:服务器维护一个长链接会增长开销。 
实例:Gmail聊天


Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript经过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通讯,JavaScript在收到服务器端传送的信息后控制页面的显示。 
优势:实现真正的即时通讯,而不是伪即时。 
缺点:客户端必须安装Flash插件;非HTTP协议,没法自动穿越防火墙。 
实例:网络互动游戏。

 

 
 
好文要顶  关注我  收藏该文   
1
0
 
 
 
« 上一篇: Python Select 解析
posted @  2016-03-30 16:12 金角大王 阅读(794) 评论(0)  编辑 收藏
相关文章
相关标签/搜索