シナリオ:バックエンド更新データがクライアントにプッシュされます(JavaパーツはTomcatサーバーを使用します)。
ポーリング、彗星、WebSocketなど、バックエンドでデータをプッシュするための多くのソリューションがあります。
1。ポーリングはバックエンドの開発コストが最も低いため、AJAXのリクエストを処理し、従来の方法でデータを返すことを意味します。私が学校にいたとき、実験室のプロジェクトは常に投票を使用していました。これは、最も安全で実装が最も簡単であるためです。ただし、投票によって引き起こされるコミュニケーションリソースの無駄は無視することはできません。データが変更されるかどうかに関係なく、リクエストは通常どおり送信および応答され、各HTTPリクエストには長いヘッダー情報があります。
2。彗星の概念は長いつながりです。クライアントがリクエストを送信した後、バックエンドは接続がタイムアウトするか、バックエンドがデータを返すまで接続を保持し、接続を再確立し、実際にサーバーリソースを消費するサーバーに通信リソースを効果的に転送します。
3。WebSocketは、HTML5が提供する全二重通信テクノロジーです。 「ハンドシェイク」を通じて、クライアントとサーバー間の通信を実現します。リアルタイムのパフォーマンスと小さな頭があります。現在サポートされているブラウザは次のとおりです。
理想的な状況は、WebSocketとCometの組み合わせを使用し、Cometメソッドを使用してIE8などのブラウザをダウングレードすることです。ただし、このようにして、バックエンドは、リクエストを処理するために2つのロジックを実装する必要があります。つまり、WebSocketとCometが必要です。したがって、この記事はnode.jsを追加しましたこれを行う理由は、実際の状況では、フロントエンド開発者がバックエンド開発者を促進するのは容易ではないため、websocket(またはcomet)をnode.jsパーツに処理するロジックを転送することです。 node.jsは、ブラウザとJavaビジネスロジックレイヤー間の通信の中間層であり、クライアントをTomcatに接続し、ソケットを介してTomcatと通信します(ソケットではなくソケットであり、バックエンドはソケットインターフェイスを実装する必要があります。
クライアントでは、socket.ioを介してWebSocketとCometが実装されます。 Socket.ioは、さまざまなブラウザバージョンまたは異なるクライアントに適切な実装方法(WebSocket、Long Pull ..)を選択します。 socket.ioの導入により、WebSocket(または長い接続)を簡単に処理できます。 socket.io
クライアントはsocket.ioを紹介します:
<Script src = "static/js/socket.io.js"> </script>
クライアントJavaScriptコード:
var socket = io.connect( '127.0.0.1:8181'); // server socket.emit( 'fromwebclient'、jsondata)にデータを送信します。
node.jsサーバーコード:
var http = require( 'http')、app = http.createserver()。聞き取り( '8181')、io = require( 'socket.io')。聞き取り(app); io.sockets.on( 'connection'、function(socketio){//クライアントsocketio.on( 'fromwebclient'、function(webclientdata){// do sth。}); // socketio.on( 'disconnect'、function(){console.log( 'console.log); socketio.emit( 'pushtowebclient'、jsondata);クライアントとnode.jsサーバーの間に適切な接続を確立することは、最初のステップにすぎません。以下には、node.jsサーバーとJavaビジネスロジックレイヤー間の接続を確立する必要があります。この時点で、Node.jsサーバーは、TOMCATにTCP接続要求を送信するクライアントとして機能します。接続が成功した後、node.jsサーバーとTomcatが完全な二重チャネルを確立し、それが唯一のものです。クライアントリクエストがいくらであっても、node.jsサーバーからTomcatに転送されます。同様に、Tomcatによってプッシュされたデータは、node.jsサーバーを介して各クライアントにも配布されます。
ここには問題があります。つまり、WebSocket接続とソケット接続の両方が確立された後、2つの接続がブロックされます。 Tomcatは、どのWebSocket接続がデータを送信したかを知りませんし、どのクライアントがデータを送信したかも知りません。もちろん、node.jsはセッションIDを使用してTomcatに送信して、どのクライアントであるかを識別できますが、この記事では別の方法を使用します。
クライアントがnode.jsとのwebsocket接続を確立すると、各接続にはここでSocketioと呼ばれるインスタンスが含まれます。各Socketioには、この接続を一意に識別するID属性があります。これはここでSocket_IDと呼ばれます。 socket_idを使用して、Node.jsサーバーにマッピングテーブルが確立され、各SocketioとSocket_IDの間のマッピング関係を保存します。 Node.jsサーバーがTomcatにデータを送信すると、Socket_IDがそれに伴われ、Javaパートが一連の処理を実行し、各クライアントが必要とするさまざまなデータをカプセル化して返します。返されたデータは、socket_idと対応する関係を持つ必要があります。このようにして、Node.jsサーバーがTomcatから送信されたデータを受信すると、前述のマッピングテーブルを介して異なるSocketioによって異なるクライアントに配布されます。
node.jsサーバーコード:
var http = require( 'http')、net = require( 'net')、app = http.createserver()。聞き取り( '8181')、io = require( 'socket.io')。 // tomcat nodeserver.connectに接続(8007、 '127.0.0.1'、function(){console.log( 'connected');}); //クライアントのwebsocket接続インスタンスvar asocket = {}を保存します; //クライアントとの接続を作成するio.sockets.on( 'connection'、function(socketio){//クライアントからデータを受信し、tomcat socketio.on( 'fromwebclient'、function(webclientdata){//マッピングテーブルに保存します。 = socketio.id // tomcat nodeServer.write(webclientdata)に送信}); // tomcat nodeserver.on( 'data'、function(data){var jsondata = json.parse(data.tostring())からデータを受け取るjsondata.list [i] .data);上記のコードでは、Tomcatからnode.jsサーバーで受信したデータが2つのタイプに分割され、1つはプッシュされたデータ、もう1つはリクエストに応答するデータです。ここでは、プッシュされたデータは均一に処理されます。
通信を処理する場合、node.jsからtomcatに送信されたデータは文字列形式であり、Tomcatから受信したデータはバッファオブジェクト(8バイト)であり、文字列に変換してからJSONに変換されてクライアントに送信されます。
この記事は、このような2つの接続の簡単な例を示しているだけで、多くのことを特定のビジネスに追加する必要があります。 Node.jsがプロジェクトに導入されるため、フロントエンドは、処理、キャッシュ、さらには多くのビジネスロジックを追加するなど、さらに多くのことを行う必要があります。