検索
ホームページウェブフロントエンドjsチュートリアルJavaScript における Web コミュニケーションの知識ポイントのまとめ (共有)

JavaScript における Web コミュニケーションの知識ポイントのまとめ (共有)

Web コミュニケーションは非常に大きなテーマであり、幅広い分野をカバーしています。最近JavaScriptでのWebコミュニケーションの知識を学んだので、ここにまとめておきます。

1. はじめに

1. Comet テクノロジー

Web アプリケーションのフロントエンドであるブラウザーの処理機能は限られています。ブラウザの開発にはクライアントソフトウェアのバージョンアップが必要ですが、同時にクライアントブラウザソフトウェアの多様性は、ある意味新しいブラウザ技術の普及にも影響を及ぼします。

Web アプリケーションにおけるブラウザの主な仕事は、リクエストを送信し、サーバーから返された情報を解析し、それをさまざまなスタイルで表示することです。 AJAX はブラウザ テクノロジの発展の成果であり、ブラウザ側で非同期リクエストを送信することでシングル ユーザー操作の応答性を向上させます。

しかし、Web は本質的にマルチユーザー システムであり、どのユーザーにとってもサーバーは別のユーザーとみなすことができます。既存の AJAX テクノロジの開発では、マルチユーザー Web アプリケーションで更新情報をリアルタイムでクライアントに送信するという問題を解決できないため、ユーザーは「古い」情報の下で操作する可能性があります。 AJAX の適用により、バックグラウンド データをより頻繁に更新できるようになります。

インターネットの発展に伴い、さまざまな Web サイト監視、インスタント見積、インスタント メッセージング システムなどの Web アプリケーションが無限に登場します。ユーザーにより良いエクスペリエンスを提供するために、サーバーは頻繁に情報をプッシュする必要があります。クライアント。

開発者は通常、AJAX ベースのロング ポーリングまたは iframe および htmlfile に基づくストリーム処理を使用します。もちろん、プログラムによっては、比較的良好なパフォーマンスで「プッシュ」情報をサポートするために、さまざまなプラグイン (Java アプレットまたは Flash) をクライアントにインストールする必要があります。

2. HTTP プロトコルにおける長い接続と短い接続

短い接続の操作手順は次のとおりです: 接続の確立 - データ送信 - 接続の終了...接続の確立 - データ送信 - 接続の終了

長期接続の手順は次のとおりです: 接続の確立-データ送信...(接続を維持)...データ送信-接続を閉じる

長期接続と短期接続の違い 主な違い原因は、クライアントとサーバーで採用されているシャットダウン戦略の違いにあります。短い接続では、接続を確立した後、接続を閉じる前に 1 つのデータ送信のみが実行されますが、長い接続では、接続が閉じられるまで複数のデータ送信が実行されます (長い接続では、接続は Connection: Closed ヘッダー フィールドによって閉じられます)。

2. Webコミュニケーション

まず、xhrのreadystateのさまざまな状態を理解する必要があります。

JavaScript における Web コミュニケーションの知識ポイントのまとめ (共有)

1. ポーリング

ポーリングは、情報を「プル」する動作モードです。タイマーを設定してサーバーに情報があるかどうかを定期的に問い合わせます。データを送信するための接続が確立されるたびに、リンクが閉じられます。

フロントエンド実装:

var polling = function(url, type, data){
    var xhr = new XMLHttpRequest(), 
        type = type || "GET",
        data = data || null;

    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4) {
            receive(xhr.responseText);
            xhr.onreadystatechange = null;
        }
    };

    xhr.open(type, url, true);
    //IE的ActiveXObject("Microsoft.XMLHTTP")支持GET方法发送数据,
    //其它浏览器不支持,已测试验证
    xhr.send(type == "GET" ? null : data);
};

var timer = setInterval(function(){
    polling();
}, 1000);

ポーリング プロセス中に、ネットワーク上の理由により前の xhr オブジェクトが送信されなかった場合、タイマーは次のクエリを開始し、最後のクエリが送信はまだキュー内にありますが、この問題についてはまだ調査していません。興味があれば、ajax リクエスト管理キューを自分で作成できます。

2. ロングポーリング

実際、ロングポーリングには特別なことは何もありません。接続が閉じられたときにすぐに xhr オブジェクトに接続することです~ コードを読んでください :

var longPoll = function(type, url){
    var xhr = new XMLHttpRequest();

    xhr.onreadystatechange = function(){
        // 状态为 4,数据传输完毕,重新连接
        if(xhr.readyState == 4) {
            receive(xhr.responseText);
            xhr.onreadystatechange = null;

            longPoll(type, url);
        }
    };

    xhr.open(type, url, true);
    xhr.send();
}

サーバーが切断されると、クライアントは少しの休息も与えずにすぐに接続します。これはロングポーリングです。

3. データ フロー

データ フロー方式では、確立された接続が切断される前、つまり、readystate が 3 の時点でデータを受け取りますが、厄介な点はここにもあります。送信の場合、取得する xhr.response はデータの半分になる可能性があります。データ送信プロトコルを定義するのが最善です。たとえば、最初の 2 バイトは文字列の長さを表し、この長さの内容のみを取得します。をクリックし、カーソルの位置を変更します。

データ形式が次の場合: data splitChar data はデータの内容、splitChar はデータの終了マーク (長さは 1) です。この場合、送信されるデータの内容は data splitChar data splitChar data splitChar...

var dataStream = function(type, url){
    var xhr = new XMLHttpRequest();

    xhr.onreadystatechange = function(){

        // 状态为 3,数据接收中
        if(xhr.readyState == 3) {
            var i, l, s;

            s = xhr.response; //读取数据
            l = s.length;     //获取数据长度

            //从游标位置开始获取数据,并用分割数据
            s = s.slice(p, l - 1).split(splitChar);

            //循环并操作数据
            for(i in s) if(s[i])  deal(s[i]);

            p = l;  //更新游标位置

        }

        // 状态为 4,数据传输完毕,重新连接
        if(xhr.readyState == 4) {
            xhr.onreadystatechange = null;

            dataStream(type, url);
        }
    };

    xhr.open(type, url, true);
    xhr.send();
};

このコードには問題があります。readystate が 3 の場合、データは取得できますが、このとき取得されたデータは、データの一部全体である場合、後半は取得できません。

readystate は、データ送信が完了するまで変更されません。これは、残りのデータの受け入れを継続しないことを意味します。以下の例でわかるように、readystate を定期的に監視できます。

この種の処理は複雑ではありませんが、問題があります。上記のポーリングとロングポーリングはすべてのブラウザでサポートされているため、IE 互換のコードは作成しませんでしたが、ここでは、IE の下位バージョンでは、readystate が 3 のときにデータを読み取ることができないため、他の方法を使用してこれを実現する必要があります。 。

ajax が Web トピックに登場する前に、iframe という魔法の武器がすでにありました。iframe を使用すると、引き続きデータを非同期で取得できます。IE の以前のバージョンでは、iframe を使用してデータ ストリームを受け入れることができます。

if(isIE){
    var dataStream = function(url){
        var ifr = document.createElement("iframe"), doc, timer;

        ifr.src = url;
        document.body.appendChild(ifr);

        doc = ifr.contentWindow.document;

        timer = setInterval(function(){

            if(ifr.readyState == "interactive"){
                // 处理数据,同上
            }

            // 重新建立链接
            if(ifr.readyState == "complete"){
                clearInterval(timer);

                dataStream(url);
            }
        }, 16);
    };
};

定时去监听iframe的readystate的变化,从而获取数据流,不过,上面的处理方式还是存在问题。数据流实现“服务器推”数据的原理是什么呢,就是文档(数据)还没有加载完,这个时候浏览器的工作就是去服务器拿数据完成文档(数据)加载。

所以上述利用iframe的方式获取数据,会使浏览器一直处于加载状态,title上的那个圈圈一直在转动,鼠标的状态也是loading,这看着是相当不爽的。

幸好,IE提供了HTMLFile对象,这个对象就相当于一个内存中的Document对象,它会解析文档。所以我们创建一个HTMLFile对象,在里面放置一个IFRAME来连接服务器。这样,各种浏览器就都支持了。

if(isIE){
    var dataStream = function(url){
        var doc = new ActiveXObject("HTMLFile"), 
            ifr = doc.createElement("iframe"), 
            timer, d;

        doc.write("
");         ifr.src = url;         doc.body.appendChild(ifr);         d = ifr.contentWindow.document;         timer = setInterval(function(){             if(d.readyState == "interactive"){                 // 处理数据,同上             }             // 重新建立链接             if(d.readyState == "complete"){                 clearInterval(timer);                 dataStream(url);             }         }, 16);     }; };

4.websocket

websocket是前端一个神器,ajax用了这么久了,相关技术也是很成熟,不过要实现个数据的拉取确实十分不易,从上面的代码中也看到了,各种兼容性问题,各种细节处理问题。

var ws = new WebSocket("ws://www.example.com:8888");

ws.onopen = function(evt){};
ws.onmessage = function(evt){
    deal(evt.data);
};
ws.onclose  = function(evt){};

//ws.close();

新建一个WebSocket实例,一切就OK了,ws:// 是websocket的连接协议,8888为端口号码。onmessage中提供了data这个属性,相当方便

5.EventSource

HTML5中提供的EventSource这玩意儿,这是无比简洁的服务器推送信息的接受函数。

new EventSource("test.php").onmessage=function(evt){
    console.log(evt.data);
};

简洁程度和websocket是一样的啦,只是这里有一个需要注意的地方,test.php输出的数据流应该是特殊的MIME类型,要求是"text/event-stream",如果不设置的话,你试试~ (直接抛出异常)

6.ActionScript

情非得已就别考虑这第六种方式了,虽说兼容性最好,要是不懂as,出了点bug你也不会调试。

具体实现方法:在 HTML 页面中内嵌入一个使用了 XMLSocket 类的 Flash 程序。JavaScript 通过调用此 Flash 程序提供的套接口接口与服务器端的套接口进行通信。JavaScript 在收到服务器端以 XML 格式传送的信息后可以很容易地控制 HTML 页面的内容显示。

7.Java Applet套接口

三、后端处理方式

本文主要是总结Javascript的各种通讯方式,后端配合node来处理,应该是挺给力的。

var conns = new Array();

var ws = require("websocket-server");
var server = ws.createServer();

server.addListener("connection", function(connection){
  console.log("Connection request on Websocket-Server");
  conns.push(connection);
  connection.addListener('message',function(msg){
        console.log(msg);
        for(var i=0; i<conns.length server.listen><p>下面是一个php的测试demo。</p>
<pre class="brush:php;toolbar:false">header('Content-Type:text/html; charset=utf-8');
while(1){
    echo date('Y-m-d H:i:s');
    flush();
    sleep(1);
};

四、web 通信方式利弊分析

轮询,这种方式应该是最没技术含量的,操作起来最方便,不过是及时性不强,把定时器的间隔时间设置的短一些可以稍微得到缓和。

长轮询,算是比较不错的一个web通讯方式,不过每次断开连接,比较耗服务器资源,客户端到无所谓。

数据流,他和长轮询不同之处是接受数据的时间不一样,数据流是readystate为3的时候接受,低版本IE不太兼容,处理起来略麻烦,而且还要自己设计数据传输协议。不过他对资源的消耗比上面几种都可观。

websocket和EventSource,两个利器,不过,没几个浏览器支持,这是比较让人伤心~

ActionScript和Java Applet,两者都是需要在客户端安装插件的,一个是Flash插件,一个是Java插件,而且搞前端的人一般对这东西不太熟悉,如果没有封装比较好的库可以使用,那建议还是别用了。

更多编程相关知识,请访问:编程视频!!

以上がJavaScript における Web コミュニケーションの知識ポイントのまとめ (共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は博客园で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:開発者の比較分析Python vs. JavaScript:開発者の比較分析May 09, 2025 am 12:22 AM

PythonとJavaScriptの主な違いは、タイプシステムとアプリケーションシナリオです。 1。Pythonは、科学的コンピューティングとデータ分析に適した動的タイプを使用します。 2。JavaScriptは弱いタイプを採用し、フロントエンドとフルスタックの開発で広く使用されています。この2つは、非同期プログラミングとパフォーマンスの最適化に独自の利点があり、選択する際にプロジェクトの要件に従って決定する必要があります。

Python vs. JavaScript:ジョブに適したツールを選択するPython vs. JavaScript:ジョブに適したツールを選択するMay 08, 2025 am 12:10 AM

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScript:それぞれの強みを理解するPythonとJavaScript:それぞれの強みを理解するMay 06, 2025 am 12:15 AM

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

JavaScriptのコア:CまたはCの上に構築されていますか?JavaScriptのコア:CまたはCの上に構築されていますか?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptアプリケーション:フロントエンドからバックエンドまでJavaScriptアプリケーション:フロントエンドからバックエンドまでMay 04, 2025 am 12:12 AM

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワーク:最新のWeb開発のパワーJavaScriptフレームワーク:最新のWeb開発のパワーMay 02, 2025 am 12:04 AM

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境