ホームページ > ウェブフロントエンド > jsチュートリアル > Nodeのネットモジュールについて語る記事

Nodeのネットモジュールについて語る記事

青灯夜游
リリース: 2023-02-09 20:00:23
転載
2415 人が閲覧しました

ネット モジュールは Node.js で提供され、カプセル化と TCP およびソケットのサポートを提供します。この記事では、Node の net モジュールについて紹介します。

Nodeのネットモジュールについて語る記事

以前チュートリアルを見たとき、その多くは IO、バッファー、パス、イベント、fs、プロセス、ノードのイベント ループ メカニズムから始まりました。確かに、ノード開発が依存する主要な開発依存関係について説明します。しかし、私は非常に不安です。ノードについて学んだときから、それはノードがバックエンドを実行できることを意味しますが、これらのコースの前半はすべてノードが持つ機能についてです。クライアント通信モジュールの紹介

非常に違和感があるので、自分でまとめを書く際には、サーバーとクライアント間の通信モジュールを書かなければなりません。イベント モジュールと fs モジュールがプロセスに関与している場合でも、当面は知識ポイントを脇に置き、net モジュールが全体として通信をどのように実装するかを理解するだけで問題ありません。

1. OSI 7 層プロトコル モデル

通信モジュールを学びたい場合は、ネットワーク通信モデルを理解する必要があります。ネットワークを覚えたい場合は、ネットワーク通信モデルを理解する必要があります。コミュニケーションモデルは、記憶を助けるために練習する必要があります。これがインタビューの焦点です。この分野には多くの内容があり、より深く理解したいです。また、体系的な学習が必要であるとも述べました。ここにあります」簡単に言及します。 [推奨される関連チュートリアル:

nodejs ビデオ チュートリアル プログラミング教育 ]

この古い写真を送信してください:

Nodeのネットモジュールについて語る記事 ##フロントエンドでは、TCP/IP プロトコル クラスターのシステム結果を記憶する必要があります。

    アプリケーション層: http(80 ポート)、FTP(21)、SMTP(メールの送信)、POP (メール受信)、DNS
  • トランスポート層: TCP/UDP
  • インターネット層: IP、ICMP (IP 層アクセサリです)プロトコル)
  • データリンク層: PPP、SLIP
  • 物理層: ネットワークにはツイストペア、同軸ケーブル、光ファイバー、その他の伝送が含まれますメソッドは ISO2110 仕様に準拠しています
  • IP プロトコルに付属するプロトコルである
ICMP

から、あまり厳密に行う必要はないことがわかります。ネットワーク プロトコルの階層化 ICMP 基礎として IP プロトコルが必要であることは明らかですが、ネットワーク層としても計画されています。OSI モデルについての正しい理解は、OSI モデルを使用して次のことを行うべきであると思います。いわゆるプロトコルを使用するのではなく、問題を分析します。階層化の方が意味があります。

TCP/IP プロトコル クラスターは、TCP プロトコルと IP プロトコルだけを指すのではなく、これら 2 つのプロトコルが含まれるためです。 TCP/IP は、インターネットを総称するために使用されます。関連するプロトコルが集まったものです。別の言い方をすると、TCP/IP プロトコルを使用するプロセスで使用されるプロトコル ファミリの総称です。 .

クライアントとサーバーの送信フローは次のとおりです

##役割が Nodeのネットモジュールについて語る記事sender

になった場合受信者の場合、送信フローは次のとおりです。

送信プロセス中に、送信側から開始して、必要なヘッダー情報が追加されることがわかります。プロトコルの層を通過せずに、チェックの層、コーディングの層ごとに、受信側になると、代わりに、各層の後で対応するヘッダーが剥がされます。最終的に HTTP データが取得されるまで待つだけです。Nodeのネットモジュールについて語る記事

上の図は「図解 HTTP」から引用です。

上 これは一般的なネットワーク プロトコル モデルです。

疑問: ネットワークの名前がなぜそうなるのかOSI システムの結果を TCP/IP 5 層プロトコルに統合すると、この層はインターネット層になると書籍や多くの場所で書かれています?

2. TCP 接続

#最初のハンドシェイク: クライアントは SYN フラグ (シーケンス番号は J) をサーバーに送信し、SYN_SENT 状態に入ります (サーバーが状態を確認するのを待ちます)

Nodeのネットモジュールについて語る記事2 回目のハンドシェイク: サーバーはクライアントから SYN J を受信し、データ パケットが受信されたことを確認し、ACK フラグ (シーケンス番号は J 1) と SYN フラグ ビット (シーケンス番号は K) を送信します。 SYN_REVD 状態に入ります (リクエスト受諾およびクライアント確認待ち状態)

3 回目のハンドシェイク: クライアントは接続確立状態に入った後、サーバーに ACK を送信しますフラグ ビット (K 1)、クライアントが接続を確立していることを確認します。確立された接続を受信しました。サーバーが ACK フラグを受信した後、サーバーは接続確立状態に入ります。

J と K は両方とも接続に誰が参加しているかを確立するために使用されます。リクエストはありません。 SYN と ACK の構造は異なりますが、送信されるオブジェクトが異なります。

3. net module

net moduleItは、上記の TCP 接続の具体的な実装です。

まず第一に、API を学ぶには、公式ドキュメントに直接アクセスすることをお勧めします。中国語のドキュメントの内容は最新バージョンではありません

学習するとき、英語の文書を読む時間があるときは、英語の文書を読むようにしています。これを半年にわたって主張してきました。最初は我慢できませんでしたが、今では我慢できます不快感を感じて読んでください。半年で進歩は明らかでした。そしてこの種の不快感は良いことであり、それはここがあなたのコンフォートゾーンではないことを意味します結局のところ、コンフォートゾーンを超える勇気が進歩の源です

次に、本題に入ります。通信を学びたいので、クライアントとサーバーをシミュレートする 2 つのオブジェクトが必要です。2 つのファイル client.js と # を作成します。 ##service.js をそれぞれコマンド ラインで作成します:

touch client.js && touch service.js
ログイン後にコピー

3.1 service.js パート

net を紹介します。モジュールを開き、サーバーを LISTENT 状態にし、ポート番号とホスト アドレスを構成し (DNS 解決プロセスを手動でスキップします)、クライアントの呼び出しを待ちます

const net = require("net");
const post = 3306;
const host = "127.0.0.1";

const server = net.createServer();
server.listen(post, host);
ログイン後にコピー

この時点で、サーバーは、TCP 接続サーバーに対応します。

LISTEN ステータス。

その後、いくつかの必要なイベントを監視し、サーバーによって提供されるフックです。(イベント関連の知識に属します)

server.on("listening", () => {
  console.log("服务器已经可以连接啦");
});

server.on("connection", (socket) => {
  console.log("有客户端来访咯");
});

server.on("close", () => {
  console.log("服务器关闭了");
});

server.on("error", (error) => {
  console.log("服务器出错啦: ", error); // error 有错误的信息
});
ログイン後にコピー

上記のコード文字列には、

  • listening: ポートをリッスンした後にトリガーされるイベント
  • connection:クライアントがアクセスするとイベントがトリガーされます
  • close: サーバーが閉じられるとイベントがトリガーされます
  • error: サーバー エラー トリガー

close については、バックグラウンド ブラザーが通常、直接

ps
kill -9 pid
ログイン後にコピー

によってスレッドを強制終了することに注意する必要があります。 , 仮パラメータはソケット名です。その中国語訳はネストされた単語であり、ノードごとにストリームにカプセル化されます。大まかに理解すると、クライアントによって送信されたデータです。これは、データ自体が独自のメソッドを持っています。 process

socket

in

connection

server.on("connection", (socket) => {
  console.log("有客户端来访咯");

  socket.on("data", (data) => {
    console.log(data); // 客户端发送过来的数据
  });
});
ログイン後にコピー
stream 後ほど記事で紹介します

サーバーがデータを受け取れるので
socket.on

に記述します (もちろん外部に記述しても構いません):

socket.write("我已经收到你的服务器了哦,客户端");
ログイン後にコピー
このとき、クライアントがデータの受け入れを完了し、接続を閉じます。

socket.on('close') を渡すこともできます。フックは次のものをリッスンします:

socket.on("close", () => {
  console.log("客户端把另外一头的流给关了");
});
ログイン後にコピー

socket の概要イベントは client.js

に置かれます。 この時点での

service.js の内容はすべて次のとおりです。

const net = require("net");
const post = 3306;
const host = "127.0.0.1";

const server = net.createServer();
server.listen(post, host);

server.on("listening", () => {
  console.log("服务器已经可以连接啦");
});

server.on("connection", (socket) => {
  console.log("有客户端来访咯");

  socket.on("data", (data) => {
    console.log(data); // 客户端发送过来的数据

    socket.write("我已经收到你的服务器了哦,客户端");
  });

  socket.on("close", () => {
    console.log("客户端把另外一头的流给关了");
    server.close(); // 客户端已经不要数据了,那么我们就把服务器给关闭了吧
  });
});

server.on("close", () => {
  console.log("服务器关闭了");
});

server.on("error", (error) => {
  console.log("服务器出错啦: ", error); // error 有错误的信息
});
ログイン後にコピー
3.2 client.js 部分

クライアント側は、 simpler.

const net = require("net");
const post = 3306;
const host = "127.0.0.1";

const socket = net.connect(post, host);

socket.on("connect", () => {
  console.log("已经连接到服务器了哦");
});

socket.write("服务器, 我来了");
socket.on("data", (data) => {
  console.log(data.toString());
  socket.end();
});

socket.on("close", () => {
  console.log("连接已关闭了");
});
ログイン後にコピー
socket

connect のイベントの概要: サーバーへの接続成功によってトリガーされます

  • data : サーバーから送信されたパラメータを受信
  • end: データ受信完了後にトリガー
  • close: トリガータイミングソケットが閉じられています
  • service.js および
  • client.js
フレームワークが作成されました。2 つのターミナルを開いて実行します:

node service.js
node client.js
ログイン後にコピー
印刷結果は自分で見てください .TCP 接続のフレームワークはほぼ完成しました。もちろん、実際の制作はそれだけではありません。スティッキー パケット、アンパッキング/パッケージング、ハートビートなども処理する必要があります。

この記事は、https://juejin.cn/post/7084618854801866765

著者: 私はリトルオレンジです

#ノード関連の知識については、

nodejs チュートリアル

を参照してください。

以上がNodeのネットモジュールについて語る記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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