コードGiteeクラウドクラウド--GitHubを学ぶためのソフトウェアプラットフォーム

コード雲Gitee http://git.oschina.net/jackjiang/MobileIMSDK

http://www.blogjava.net/jb2011/archive/2018/11/27/433523.html

ウェブインスタントメッセージング技術のエンド在庫:短いポーリング、彗星、WebSocketを、SSE

限られたブラウザへのWebエンドインスタントメッセージング技術の設計上の制約は、エンド主流のWebインスタントメッセージングプログラムは、基本的には4種類あり、簡単に実装することではないされています:伝統的なAjaxのポーリング短い、彗星技術、WebSocketの技術、SSE(サーバー-sentイベント)。この記事では簡単に彼らの類似点と相違点、利点と欠点を注意して、技術の4つの原則を紹介します。

2.概要

1996年にIETF HTTPワーキンググループは、HTTPプロトコルのバージョン1.0をリリースしました、現在広く使用されたバージョン1.1に、HTTPプロトコルは、開発の17年を経験しています。この分散、ステートレス、迅速な開発/応答スタイルに基づいてTCP要求は、インターネットプロトコル流行で、今日広く使用されている、インターネットに関しては、非常に遅い進行のようです。今から、インターネットの台頭に、web1.0ポータル流行の時代を経て、その後、Ajax技術、Webアプリケーション開発の出現でのWeb2.0時代の流行のため、現在はweb3.0の方向に移動しています。デフォルトの長い接続以外に加えて、バージョン1.0から1.1に開発されたコントラストのhttpプロトコル、キャッシング、帯域幅の最適化、およびセキュリティの向上の表面的な側面です。これは、ステートレス要求/応答モードを保持している、私はそれを変更する必要があり実現したことがないように見えます。

幸い、HTML5時間は即時エンドWeb通信を達成するために2つの技術的ソリューションをのWebSocketを持参し、SSE(サーバー-送られるイベント)に来ています。

3. Ajaxの短いポーリング:スクリプトによって送信されたHTTPリクエスト

サーバーと対話するために、従来のWebアプリケーションでは、フォーム(フォーム)、サーバが受信を提出し、送信フォームを処理し、その後、新しいページに前と2ページ後のデータのほとんどが同じであるため、この転送プロセスを返す必要があります冗長データ、および帯域幅の浪費がたくさん。Ajaxのような技術はされて入ってきました。

アヤックスは、最初のジェシー・ジェームス・ギャレットが提案した、非同期JavaScriptとXMLの略です。この画期的な技術は、ブラウザのスクリプト(JS)は、HTTPリクエストを送信することができます。Outlook Web Accessのグループは、彼のグールグループ、Gmailやその他のインタラクティブなアプリケーションでは、この技術の普及をグーグル、1998年に使用され、すぐIE4.0の一部となったが、この技術は2005年の初めまでは、非常に少数派となっていますそれは、Ajaxはすぐにすべてに受け入れられたことができます。

Ajaxクライアントとサーバー側のデータの出現ははるかに少ない転送するだけでなく、多くの高速化だけでなく、Web2.0の時代の初期の開発によって特徴づけられるユーザーエクスペリエンスを豊かにする必要性を満たすために、だけでなく、ゆっくりと欠点が彼を露呈しました。インスタントメッセージングおよびデータ要件の他のリアルタイム更新など豊富なインタラクティブなアプリケーションを満たすことができません。このブラウザ側の小さな技術ベースのhttpプロトコルでは、すべての後に、パターンHTTPプロトコルは、HTTPプロトコル自体は変更されていない限り、また、変更することはできません要求/応答が必要です。

4.彗星:技術ハックの一種

従来のポーリング方式に基づく低遅延のデータ要件のためのWebアプリケーションに代表されるインスタントメッセージング、と会うことができなかった、と悪いユーザー体験を持つことができます。だから、ベースの「サーバプッシュ」のhttp長い接続技術がハックされます。この技術は命名された彗星のプロジェクトマネージャーで道場ツールキットのアレックス・ラッセル用語のブログ、ブラウザのための低遅延データ:彗星が最初に提案された、と立って。

実際には、長押しサーバがある、そこに広くあまりにも怠惰なブラウザ、古典的なクライアント/サーバモデルで使用されており、この技術のための良いサポートを提供していませんでした。しかし、Ajax技術の出現は、ブラウザ、GoogleのGmailと、この技術を使用する最初のGtalkなどの統合でこれを可能にします。決意と(例えばIEアドオンショーの質問など)いくつかの重要な問題、そしてすぐにこの技術が認識されている、成熟したオープンソース彗星のフレームワークの多くは、すでに存在しています。

以下は典型的なAjaxとコメットデータ送信、単純差の比較です。典型的なAjaxの通信は、あなたが最初の要求を送信する必要があり、データを取得するためには、httpプロトコルを使用するための古典的な方法です。低遅延は、比較的高いWebアプリケーションでは、サーバは要求の頻度を増やすことができます。彗星は、クライアントとサーバが持続的な接続、クライアントを更新するために必要なデータだけを維持するために、異なる場合、サーバーはクライアントにデータをプッシュするためのイニシアチブをとるました。



彗星は、フローのiframeとHTMLFILE(HTTPストリーミング)モードに基づいて、2通りの方法で主にベースのAjaxロングポーリング(ロングポーリング)モードで実装されています。

?彗星技術記事の詳細については、以下を参照してください。「彗星の技術が説明:Webベースのリアルタイム通信技術のエンド長いHTTP接続を、」 "WEBエンドIM:HTTP長い接続、ロングポーリング(ロングポーリング)詳細「」WEBエンドIM:WebSocketを同じ缶即時のメッセージ得ない『』同時エンドWebの何百万人のためのサポート:オープンソース彗星サーバーiCometをインスタントメッセージング?プログラム。」

4.1 Ajaxベースのロングポーリング(ロングポーリング)モード

要求のXMLHttpRequestブラウザが要求を行う後、サーバーが返す前に、データまたはタイムアウトがあるまで要求は、それが要求をブロックします受け取り、接続を再確立するために、もう一度リクエストを処理して、ブラウザのJS復帰情報(タイムアウトまたは有効なデータ)。この間、サーバーは、新しいデータが到着していて、サーバは接続が再確立されるまで、ブラウザは、すべてのデータを1時間を取得するデータの保存を選択します。

Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE_3.jpg 

Iフレームの流れとHTMLFILE(HTTPストリーミング)モードに基づいて4.2

Iframe是html标记,这个标记的src属性会保持对指定服务器的长连接请求,服务器端则可以不停地返回数据,相对于第一种方式,这种方式跟传统的服务器推则更接近。

在第一种方式中,浏览器在收到数据后会直接调用JS回调函数,但是这种方式该如何响应数据呢?可以通过在返回数据中嵌入JS脚本的方式,如“<script type="text/javascript">js_func(“data from server ”)</script>”,服务器端将返回的数据作为回调函数的参数,浏览器在收到数据后就会执行这段JS脚本。

Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE_4.jpg 

但是这种方式有一个明显的不足之处:IE、Morzilla Firefox 下端的进度栏都会显示加载没有完成,而且 IE 上方的图标会不停的转动,表示加载正在进行。Google 的天才们使用一个称为“htmlfile”的 ActiveX 解决了在 IE 中的加载显示问题,并将这种方法应用到了 gmail+gtalk 产品中。

5. Websocket:未来的解决方案1

如果说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)过程,建立连接之后,双方即可双向通信。

有关WebSocket的详细介,请参见即时通讯网有关WebSocket的系列文章:《WebSocket详解(一):初步认识WebSocket技术》、《WebSocket详解(二):技术原理、代码演示和应用案例》、《WebSocket详解(三):深入WebSocket通信协议细节》。

从浏览器支持角度来看,WebSocket已经近在眼前,但仍有一段较长的路要走,特别是在中国这个IE6、7、8依然盛行的国家,旧版本浏览器的消亡需要很长一段时间,在完全实现浏览器全兼容前,Comet技术可能仍然是最好的解决方案。不过,当前也已存在一些比较成熟的封装方案来解决这种兼容性限制,比如:开源的Socket.io,详见《Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架》。

6. SSE:未来的解决方案2

SSE(Server-Sent Event,服务端推送事件)是一种允许服务端向客户端推送新数据的HTML5技术。与由客户端每隔几秒从服务端轮询拉取新数据相比,这是一种更优的解决方案。

与WebSocket相比,它也能从服务端向客户端推送数据。那如何决定你是用SSE还是WebSocket呢?概括来说,WebSocket能做的,SSE也能做,反之亦然,但在完成某些任务方面,它们各有千秋。

WebSocket是一种更为复杂的服务端实现技术,但它是真正的双向传输技术,既能从服务端向客户端推送数据,也能从客户端向服务端推送数据。

WebSocket和SSE的浏览器支持率差不多,大多数主流桌面浏览器两者都支持。在Android 4.3以及更早的版本中,系统默认浏览器两者都不支持,Firefox和Chrome则完全支持;Android 4.4中,系统默认浏览器两者都支持;Safari从5.0开始支持SSE(iOS系统从4.0开始),但直到6.0才正确地支持WebSocket(6.0之前的Safari所实现的WebSocket协议存在安全问题,所以一些主流浏览器已经禁用了基于这个协议的实现)。

与WebSocket相比,SSE有一些显著的优势。个人认为它最大的优势就是便利:不需要添加任何新组件,用任何你习惯的后端语言和框架就能继续使用。你不用为新建虚拟机、弄一个新的IP或新的端口号而劳神,就像在现有网站中新增一个页面那样简单。我喜欢把这称为既存基础设施优势。

SSE的第二个优势是服务端的简洁。相对而言,WebSocket则很复杂,不借助辅助类库基本搞不定(我试过,令人痛苦)。

因为SSE能在现有的HTTP/HTTPS协议上运作,所以它能直接运行于现有的代理服务器和认证技术。而对WebSocket而言,代理服务器需要做一些开发(或其他工作)才能支持,在写这本书时,很多服务器还没有(虽然这种状况会改善)。SSE还有一个优势:它是一种文本协议,脚本调试非常容易。事实上,在本书中,我们会在开发和测试时用curl,甚至直接在命令行中运行后端脚本。

不过,这就引出了WebSocket相较SSE的一个潜在优势:WebSocket是二进制协议,而SSE是文本协议(通常使用UTF-8编码)。当然,我们可以通过SSE连接传输二进制数据:在SSE中,只有两个具有特殊意义的字符,它们是CR和LF,而对它们进行转码并不难。但用SSE传输二进制数据时数据会变大,如果需要从服务端到客户端传输大量的二进制数据,最好还是用WebSocket。

WebSocket相较SSE最大的优势在于它是双向交流的,这意味向服务端发送数据就像从服务端接收数据一样简单。用SSE时,一般通过一个独立的Ajax请求从客户端向服务端传送数据。相对于WebSocket,这样使用Ajax会增加开销,但也就多一点点而已。如此一来,问题就变成了“什么时候需要关心这个差异?”如果需要以1次/秒或者更快的频率向服务端传输数据,那应该用WebSocket。0.2次/秒到1次/秒的频率是一个灰色地带,用WebSocket和用SSE差别不大;但如果你期望重负载,那就有必要确定基准点。频率低于0.2次/秒左右时,两者差别不大。

从服务端向客户端传输数据的性能如何?如果是文本数据而非二进制数据(如前文所提到的),SSE和WebSocket没什么区别。它们都用TCP/IP套接字,都是轻量级协议。延迟、带宽、服务器负载等都没有区别,除非……呃?除非什么?

当你在享用SSE的既存基础设施优势,并在客户端和服务端脚本之间设了一个网络服务器,区别就显现出来了。一个SSE连接不仅使用一个套接字,还会占用一个Apache线程或进程,如果用PHP,它会为这个连接专门创建一个PHP新实例。Apache和PHP会使用大量的内存,这会限制服务器所能支持的并行连接数。所以,要做到用SSE在数据传输性能上和WebSocket完全一样,需要写一个自己的后端服务器,当然,那些在任何情况下都会用自己的服务器并使用Node.js的人,会觉得这有什么稀奇的。

说一下WebSocket在旧版本浏览器上的兼容。当前,大约超过2/3的浏览器支持这些新技术,移动端浏览器的支持率会低一些。依惯例,每当需要双向套接字时,就会用到Flash,并且WebSocket的向后兼容通常是用Flash来做,这已经相当复杂了,如果浏览器上没有Flash,情况更糟。概括来说,WebSocket难兼容,SSE易兼容。有关SSE的专项介绍文章请参见:《SSE技术详解:一种全新的HTML5服务器推送事件技术》。

(本文同步发布于:http://www.52im.net/thread-336-1-1.html

学习交流

- 更多即时通讯技术资料:http://www.52im.net/forum.php?mod=collection&op=all

- 即时通讯开发交流群:215891622 [推荐]

おすすめ

転載: www.cnblogs.com/klb561/p/11871729.html