1。オープニング分析
今日から、特定のモジュールで詳細に学びましょう。この記事は、このシリーズの3番目の記事です。最初の2つの記事は、主に理論に基づいています。最初の2つの記事の研究では、
また、nodejsの基本的な理解があります。大丈夫です! ! !鉄が熱くなっている間にストライクして、nodejsを最後まで運び続けましょう。まあ、あまりナンセンスを言わずに、今日のトピック「ネットモジュール」に直接進んでください。では、「ネット」はそれをどのように理解すべきですか?
それは何のためですか? ( Netモジュールを使用してソケットサーバーまたはソケットクライアントを作成できます。NodeJSデータ通信の2つの最も基本的なモジュールはNETとHTTPです。前者はTCPベースのカプセル化ですが、後者は本質的にTCPレイヤーですが、多くのデータカプセル化を行いました。
ここでは、nodejs "http.js"のソースコードを参照してください。
図から、httpserverがネットクラスを継承し、関連する通信機能を持ち、より多くのデータカプセル化を行っていることを確認することは難しくありません。これは、より高度な表現層と見なしています。
拡張された知識(以下は「継承」のソースコードです):
コードコピーは次のとおりです。
exports.inherits = function(ctor、superctor){
ctor.super_ = superctor;
ctor.prototype = object.create(superctor.prototype、{
コンストラクター:{
値:ctor、
列挙可能:FALSE、
手紙:本当、
設定可能:true
}
});
};
機能は、相続と再利用を実現することです。
一般的に使用される概念を含む簡単な概要を説明しました。これは、普及の概念の簡単な紹介です。
(1)TCP/IP --------- TPC/IPプロトコルはトランスポートレイヤープロトコルであり、主にネットワーク上のデータの送信方法を解決します。
(2)、ソケット-----ソケットは、TCP/IPプロトコル(プログラムレベル)のカプセル化と適用です。
(3)、HTTP ------ HTTPはアプリケーション層プロトコルであり、主にデータをラップする方法を解決します。
(4) The seven-layer network model----------------------------------------------------------------------------------------------------------------------
要約すると、SocketはTCP/IPプロトコルのカプセル化です。ソケット自体はプロトコルではなく、呼び出しインターフェイス(API)です。
これは、作成、リッスン、接続、受け入れ、送信、読み取りなど、私たちが知っている最も基本的な機能的インターフェイスの一部を形成します。
TCP/IPは、オペレーティングシステムの動作メカニズムと同様に、プロトコルスタックにすぎません。詳細に実装する必要があり、外部の動作インターフェイスも提供します。
実際、輸送層のTCPはネットワーク層のIPプロトコルに基づいており、アプリケーション層のHTTPプロトコルは輸送層のTCPプロトコルに基づいています。ソケット自体はプロトコルではありません。上記のように、TCPまたはUDPプログラミングのインターフェイスのみを提供します。
第二に、それを体験してください
わかりました、私たちはコンセプトを持っています、例を見てみましょう:
1。Server.jsを作成します
コードコピーは次のとおりです。
var net = require( 'net');
var server = net.createserver(function(c){//接続リスナー
console.log( "サーバー接続");
c.on( "end"、function(){
console.log( "サーバーが切断された");
});
c.write( "hello、bigbear!/r/n");
c.pipe(c);
});
server.listen(8124、function(){//リスニングリスナー
console.log( "サーバーバウンド");
});
2。CreateClient.js
コードコピーは次のとおりです。
var net = require( 'net');
var client = net.connect({
ポート:8124
}、function(){//リスナーを接続します
console.log( "クライアント接続");
client.write( 'こんにちは、ベイビー!/r/n');
});
client.on( "data"、function(data){
console.log(data.toString());
client.end();
});
client.on( "end"、function(){
console.log( "クライアント切断");
});
分析しましょう:
サーバー------ net.createServer TCPサービスを作成します。このサービスは、ポート8124にバインドされています(server.listen)。サーバーを作成した後、コールバック関数が表示されます。
上記の関数を呼び出す場合、パラメーターも関数であり、他の方法によって構築されたパイプであるソケットを受け入れ、その関数はデータ相互作用のためです。
パイプは、それを確立するためにクライアントが迎える必要があります。現時点でサーバーへのクライアントアクセスがない場合、このソケットは存在しません。
名前が示すように、客户端------net.connectはサーバーに接続されています。最初のパラメーターはオブジェクトです。ポート(ポート)は8124に設定されています。これは、サーバーが耳を傾けるポートです。ホストパラメーターが設定されていないため、デフォルトはlocalhost(ローカル)です。
サーバーでは、ソケットはパイプラインの一方の端であり、クライアントでは、クライアント自体がパイプラインの一端です。複数のクライアントがサーバーに接続されている場合、サーバーは複数のソケットを作成し、各ソケットはクライアントに対応します。
実行結果:
3。ケースの紹介
(1)次のコードは、サーバーからクライアントへの一方向通信を完了するために、クライアントにテキストを出力するサーバーだけです。
コードコピーは次のとおりです。
// sever->クライアントの一方向通信
var net = require( 'net');
var chatserver = net.createserver();
chatserver.on( 'connection'、function(client){
client.write( 'hi!/n'); //サーバーはクライアントに情報を出力し、write()メソッドを使用します
client.write( 'bye!/n');
client.end(); //サーバーはセッションを終了します
});
chatserver.listen(9000);
Telnetテスト:Telnet127.0.0.1:9000
Telnetを実行した後、サービスポイントに接続し、HIのキャラクターにフィードバックします!さようなら!、すぐにサーバープログラムを終了し、接続を終了します。
サーバーをクライアントに情報に接続したい場合はどうなりますか?
server.dataイベントを聞くことができ、接続を中止しないでください(または、受け入れられないクライアントからのメッセージをすぐに終了します)。
(2)、server.dataイベントを聞いて、接続を中止しないでください(それ以外の場合、クライアントからのメッセージはすぐに受け入れることができません)。
コードコピーは次のとおりです。
//前者に基づいて、クライアントを実装します - > Sever Communication、これは双方向通信です
var net = require( 'net');
var chatserver = net.createserver()、
clientList = [];
chatserver.on( 'connection'、function(client){
// JSはオブジェクトにプロパティを自由に追加できます。ここでは、名前のカスタム属性を追加して、どのクライアント(クライアントのアドレス +ポートが基づいているか)を示します。
client.name = client.remoteaddress + ':' + client.remoteport;
client.write( 'hi' + client.name + '!/n');
clientlist.push(client);
client.on( 'data'、function(data){
ブロードキャスト(データ、クライアント); //クライアントからの情報を受け入れます
});
});
関数ブロードキャスト(メッセージ、クライアント){
for(var i = 0; i <clientlist.length; i+= 1){
if(client!== clientList [i]){
clientList [i] .write(client.name + "say" + message);
}
}
}
chatserver.listen(9000);
上記は完全なコードですか?私たちは、考慮されていない別の問題があると言いました。つまり、クライアントが終了すると、クライアントリストに残り、明らかにヌルポインターです。
(3)クライアントリストを処理します
コードコピーは次のとおりです。
chatserver.on( 'connection'、function(client){
client.name = client.remoteaddress + ':' + client.remoteport
client.write( 'hi' + client.name + '!/n');
clientlist.push(client)
client.on( 'data'、function(data){
ブロードキャスト(データ、クライアント)
})
client.on( 'end'、function(){
clientlist.splice(clientlist.indexof(client)、1); //配列の式要素を削除します。
})
})
nodetcpapiは、クライアントがサーバーへの接続を中止したとき、エンドイベントを提供してくれました。
(4)ブロードキャストを最適化します
コードコピーは次のとおりです。
関数ブロードキャスト(メッセージ、クライアント){
var cleanup = []
for(var i = 0; i <clientlist.length; i+= 1){
if(client!== clientList [i]){
if(clientlist [i] .writable){//ソケットが最初に書き込み可能かどうかを確認します
clientlist [i] .write(client.name + "say" + message)
} それ以外 {
cleanup.push(clientlist [i])// writable執筆可能でない場合は、収集して破壊します。破壊の前に、socket.destroy()はAPIによって破壊される必要があります。
clientList [i] .destroy()
}
}
} //トラッシュループインデックスを避けるために、書き込みループからデッドノードを削除します
for(i = 0; i <cleanup.length; i+= 1){
clientlist.splice(clientlist.indexof(cleanup [i])、1)
}
}
「終了」がトリガーされないと、例外が発生するため、最適化作業が行われることに注意してください。
(5)Netapiは、クライアントの例外をキャッチするためのエラーイベントも提供します
コードコピーは次のとおりです。
client.on( 'error'、function(e){
console.log(e);
});
4つ、要約しましょう
1.最初の関連する概念を理解します
2。HTTPとネットモジュールの関係を理解します
3。この記事の例に基づいて、練習するための関連するAPIを参照してください。
4。ソケットクライアントとサーバーの間のコミュニケーションのアイデア
5.興味がある場合は、そのチャットルームの例を改善できます