ホームページ > ウェブフロントエンド > jsチュートリアル > Nodejs 学習メモ NET module_node.js

Nodejs 学習メモ NET module_node.js

WBOY
リリース: 2016-05-16 16:20:33
オリジナル
1186 人が閲覧しました

1、分析を開始します

今日から、この記事はこのシリーズの 3 番目の記事です。最初の 2 つの記事は主に理論的なものです。

私もNodeJSの基本は理解しているので大丈夫です! ! !鉄は熱いうちに打て、NodeJS を最後まで実行してみましょう。早速、今日のテーマ「ネットモジュール」にいきましょう。では、「ネット」をどのように理解すればよいでしょうか。

何に使用されますか? (Net このモジュールは、ソケット サーバーまたはソケット クライアントの作成に使用できます。NodeJS データ通信の 2 つの最も基本的なモジュールは、Net と Http です。前者は Tcp カプセル化に基づいており、後者は本質的に Tcp レイヤーです。ただし、複数のデータのカプセル化が比較されています。これをプレゼンテーション層とみなします。

これは、NodeJS「http.js」のソース コードへの参照です:

この図から、HttpServer が Net クラスを継承し、関連する通信機能を備え、さらに高度なデータのカプセル化を行うことがわかります。

拡張知識 (以下は「inherits」のソースコードです):

コードをコピーします コードは次のとおりです:

exports.inherits = function(ctor, superCtor) {
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
コンストラクター: {
値: ctor、
列挙可能: false、
書き込み可能: true、
設定可能: true
}
});
};

継承と再利用を実現する機能です。

ここでは、一般的に使用されるいくつかの概念を含む簡単な概要を説明しました。

を普及するために簡単に説明します。

(1)、TCP/IP-----TPC/IP プロトコルはトランスポート層プロトコルであり、主にネットワーク内でデータがどのように送信されるかを解決します。

(2)、ソケット-----ソケットは、TCP/IP プロトコル (プログラム レベル) のカプセル化とアプリケーションです。

(3)、HTTP-----HTTP はアプリケーション層プロトコルであり、主にデータをパッケージ化する方法を解決します。

(4)、7 層のネットワーク モデル -- 物理層、データリンク層、ネットワーク層、トランスポート層、セッション層、プレゼンテーション層、アプリケーション層。

要約すると、ソケットは TCP/IP プロトコルのカプセル化です。ソケット自体はプロトコルではなく、呼び出しインターフェイス (API) です。

これは、Create、Listen、Connect、Accept、Send、Read、Write など、私たちが知っている最も基本的な関数インターフェイスの一部を形成します。

TCP/IP は単なるプロトコル スタックであり、オペレーティング システムの動作メカニズムと同様に、具体的に実装する必要があり、同時に外部の操作インターフェイスを提供する必要があります

実際には、トランスポート層の TCP はネットワーク層の IP プロトコルをベースにしており、アプリケーション層の HTTP プロトコルはトランスポート層の TCP プロトコルをベースとしているため、Socket 自体はプロトコルではありません。上で述べたように、これは TCP または UDP プログラミングのインターフェイスを提供するだけです。

二つ、体験してください

はい、コンセプトは決まりました。例を示します:

1、server.jsを作成します

コードをコピーします コードは次のとおりです:

var net = require('net') ;
var server = net.createServer(function(c) { // 接続リスナー
console.log("サーバーが接続されました") ;
c.on("終了", function() {
console.log("サーバーが切断されました") ;
}) ;
c.write("こんにちは、ビッグベアー!rn") ;
c.pipe(c) ;
}) ;
server.listen(8124, function() { // リスニングリスナー
Console.log("サーバーがバインドされています") ;
}) ;

2、client.jsを作成します

コードをコピーします コードは次のとおりです:

var net = require('net') ;
var client = net.connect({
ポート: 8124
},function(){ // リスナーを接続します
console.log("クライアントは接続されています") ;
client.write('Hello,Baby !rn') ;
});
client.on("データ", function(data) {
console.log(data.toString()) ;
client.end() ;
});
client.on("終了", function(){
console.log("クライアントが切断されました") ;
}) ;

それを分析してください:

サーバー------net.createServerTCP サービスを作成します。このサービスはポート 8124 にバインドされます (server.listen)。サーバーを作成すると、コールバック関数

が表示されます。

上記の関数を呼び出すときに、パラメータを渡します。このパラメータも関数であり、その機能は他のメソッドによって構築されます。

この時点でクライアントがサーバーにアクセスしない場合、このソケットは存在しません。

客户端------net.connect名前が示すように、最初のパラメータは、サーバーがリッスンするポートである 8124 に設定します。デフォルトは localhost (ローカル) です。

サーバーでは、ソケットはパイプの一端であり、クライアントでは、クライアント自体がパイプの一端です。複数のクライアントがサーバーに接続すると、サーバーは複数の新しいソケットを作成し、各ソケットは 1 つのソケットに対応します。クライアント。

実行結果:

3. 事例紹介

(1)、次のコードはサーバーがクライアントにテキストを出力するだけで、サーバーからクライアントへの一方向通信が完了します。

コードをコピーします コードは次のとおりです:

// サーバー --> クライアントの一方向通信
var net = require('net');
var chatServer = net.createServer();
chatServer.on('接続', function(client) {
client.write('Hi!n'); // サーバーは write() メソッドを使用してクライアントに情報を出力します
client.write('Bye!n');
client.end(); // サーバーはセッションを終了します
});
chatServer.listen(9000);

Telnet でテスト: telnet127.0.0.1:9000

telnet を実行した後、サービス ポイントに接続し、Hi! Bye! の文字をフィードバックし、すぐにサーバー プログラムを終了して接続を終了します。

サーバーがクライアントから情報を受信できるようにしたい場合はどうすればよいでしょうか?

server.data イベントをリッスンしても、接続を終了しなくても構いません (終了しない場合、接続はすぐに終了し、クライアントからのメッセージを受け入れることができなくなります)。

(2)、server.data イベントをリッスンし、接続を終了しません (そうしないと、接続はすぐに終了し、クライアントからのメッセージを受け入れることができなくなります)。

コードをコピーします コードは次のとおりです:

// 前者をベースに、クライアント --> サーバー間の双方向通信を実現します
var net = require('net');
var chatServer = net.createServer(),
clientList = [];
chatServer.on('接続', function(client) {
// JS はオブジェクトにプロパティを自由に追加できます。ここでは、(クライアントのアドレスとポートに基づいて) どのクライアントを示すために name というカスタム属性を追加します
client.name = client.remoteAddress ':' client.remotePort
client.write('こんにちは' client.name '!n'); clientList.push(クライアント); client.on('data', function(data) {
Broadcast(data, client);//クライアントから情報を受け取る
});
});
関数ブロードキャスト(メッセージ、クライアント) {
for(var i=0;i If(client !== clientList[i]) {
clientList[i].write(client.name " 発言 " メッセージ); }
}
}
chatServer.listen(9000);



上記のコードは完全に機能しますか?考慮されていない別の問題があると述べました。クライアントが終了すると、クライアントは依然として clientList に保持されますが、これは明らかに null ポインタです。
(3)、clientList をハンドルします

コードをコピー コードは次のとおりです:

chatServer.on('接続', function(client) {
client.name = client.remoteAddress ':' client.remotePort
client.write('こんにちは' client.name '!n');
clientList.push(クライアント)
client.on('data', function(data) {
ブロードキャスト(データ、クライアント)
})
client.on('end', function() {
ClientList.splice(clientList.indexOf(client), 1); // 配列内の指定された要素を削除します。
})
})

NodeTCPAPI は、クライアントがサーバーとの接続を終了するときに発生する終了イベントを提供します。

(4)、ブロードキャストを最適化します

コードをコピーします コードは次のとおりです:

関数ブロードキャスト(メッセージ、クライアント) {
var クリーンアップ = []
for(var i=0;i If(client !== clientList[i]) {
If(clientList[i].writable) { // まずソケットが書き込み可能かどうかを確認します
clientList[i].write(client.name " 発言 " メッセージ)
} else {
cleanup.push(clientList[i]) // 書き込み可能でない場合は、収集して破棄します。破棄する前に、API メソッドを使用して Socket.destroy() を使用して破棄する必要があります。
clientList[i].destroy()
}
}
} //ループインデックスのトラッシングを避けるために、書き込みループからデッドノードを削除します
for(i=0;i clientList.splice(clientList.indexOf(cleanup[i]), 1)
}
}

「end」がトリガーされないと例外が発生するため、最適化作業が完了することに注意してください。

(5)、NetAPI はクライアント例外をキャプチャするためのエラー イベントも提供します

コードをコピーします コードは次のとおりです:

client.on('error', function(e) {
console.log(e);
});

4、まとめ

1. 初めに関連する概念を理解する

2. Http モジュールと Net モジュールの関係を理解する

3. この記事の例と組み合わせて、関連する API を確認して練習してください

4. ソケットクライアントとサーバー間の通信のアイデア

5. 興味があれば、チャット ルームの例を改善できます

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート