2つのNode.jsプロセスがどのように通信するかの詳細な説明

2つのNode.jsプロセスがどのように通信するかの詳細な説明

序文

2 つの Node.js プロセスはどのように相互に通信するのでしょうか?ここでは 2 つのシナリオがあります。

  1. 異なるコンピュータ上の 2 つの Node.js プロセス間の通信
  2. 同じコンピュータ上の 2 つの Node.js プロセス間の通信

最初のシナリオでは、通常、通信に TCP または HTTP が使用されますが、2 番目のシナリオには 2 つのサブシナリオがあります。

  1. Node.jsプロセスは、作成したNode.js子プロセスと通信します。
  2. Node.js プロセスが別の無関係な Node.js プロセスと通信する

前者は組み込みの IPC 通信チャネルを使用でき、後者はカスタム パイプラインを使用できます。カスタム パイプラインについては、以下で詳しく説明します。

異なるコンピュータ上の 2 つの Node.js プロセス間の通信

通信するためには、まずネットワーク内のプロセスを識別する方法を理解する必要があります。ネットワーク層の IP アドレスはネットワーク内のホストを一意に識別でき、トランスポート層のプロトコルとポートはホスト内のアプリケーション (プロセス) を一意に識別できます。このように、ネットワークのプロセスは、3 つの要素 (IP アドレス、プロトコル、ポート) を使用して識別できます。

TCPソケットの使用

TCP ソケットは、TCP/IP プロトコルに基づく通信方法であり、ネットワークを介して接続されたコンピューター上のプロセス間の通信を可能にします。 1 つはサーバーとして使用され、もう 1 つはクライアントとして使用されます。server.js コードは次のとおりです。

定数net = require('net')
const server = net.createServer(socket => {
  console.log('ソケットが接続されました')
  socket.on('close', () => console.log('ソケットが切断されました'))
  socket.on('error', err => console.error(err.message))
  socket.on('data', データ => {
    console.log(`受信: ${data}`)
    socket.write(データ)
    console.log(`送信: ${data}`)
  })
})
サーバー.listen(8888)

client.js コード:

定数net = require('net')
const クライアント = net.connect(8888, '192.168.10.105')

client.on('connect', () => console.log('接続されました。'))
client.on('data', data => console.log(`receive: ${data}`))
client.on('end', () => console.log('切断されました。'))
client.on('error', err => console.error(err.message))

間隔を設定する(() => {
  定数メッセージ = 'hello'
  console.log(`送信: ${msg}`)
  クライアント.書き込み(メッセージ)
}, 3000)

操作効果:

$ ノードサーバー.js
クライアントが接続されました
受信: こんにちは
送信: こんにちは

$ ノードクライアント.js
サーバーに接続する
送信: こんにちは
受信: こんにちは

HTTPプロトコルの使用

HTTP プロトコルも TCP に基づいているため、通信の観点から見ると、この方法は本質的に違いはなく、上位層プロトコルをカプセル化するだけです。 server.js コードは次のとおりです。

定数 http = require('http')
http.createServer((req, res) => res.end(req.url)).listen(8888)

client.js コード:

定数 http = require('http')
定数オプション = {
  ホスト名: '192.168.10.105',
  ポート: 8888、
  パス: '/hello',
  メソッド: 'GET'、
}
const req = http.request(オプション、res => {
  console.log(`ステータスコード: ${res.statusCode}`)
  res.on('データ', d => process.stdout.write(d))
})
req.on('error', error => console.error(error))
要求終了()

操作効果:

$ ノードサーバー.js
url /こんにちは

$ ノードクライアント.js
ステータスコード: 200
こんにちは

同じコンピュータ上の 2 つの Node.js プロセス間の通信

ネットワークソケットは、同一ホスト上のプロセス間通信(ループバックアドレス127.0.0.1経由)にも使用できますが、この方法では、ネットワークプロトコルスタック、パッケージ化とアンパック、チェックサムの計算、シーケンス番号と応答の維持など、ネットワーク通信用に設計された処理が必要です。同一コンピュータ上の2つのプロセスは、より効率的な通信方法、つまりIPC(プロセス間通信)を使用できます。Unixでの具体的な実装方法は、Unixドメインソケットです。これは、ローカルで開かれたソケットファイルを介してサーバーとクライアント間で通信する方法です。TCP通信とは異なり、通信中にローカルファイルを指定するため、ドメイン解決や外部通信は行われないため、TCPよりも高速で、同一ホスト上の伝送速度はTCPの2倍です。

組み込みIPCチャネルの使用

作成した子プロセスと通信したい場合は、非常に便利です。child_process モジュールの fork メソッドには独自の通信メカニズムがあるため、基礎となる詳細に注意を払う必要はありません。たとえば、親プロセスの parent.js コードは次のようになります。

定数 fork = require("child_process").fork
const パス = require("パス")
const child = fork(path.resolve("child.js"), [], { stdio: "inherit" });
child.on("メッセージ", (メッセージ) => {
  console.log("子からのメッセージ:", メッセージ)
  子.送信("こんにちは")
})

子プロセス child.js コード:

process.on("メッセージ", (メッセージ) => {
  console.log("親からのメッセージ:", message);
})

if (process.send) {
  setInterval(() => process.send("hello"), 3000)
}

操作効果は以下のとおりです。

$ ノードの親.js
子供からのメッセージ: こんにちは
親からのメッセージ: こんにちは
子供からのメッセージ: こんにちは
親からのメッセージ: こんにちは

カスタムパイプラインの使用

独立した Node.js プロセスが 2 つある場合、通信チャネルを確立するにはどうすればよいですか? Windows では、名前付きパイプ (Named PIPE) を使用できます。また、Unix では、Unix ドメイン ソケットを使用できます。1 つはサーバーとして、もう 1 つはクライアントとして使用できます。server.js コードは次のとおりです。

定数net = require('net')
定数 fs = require('fs')

const pipeFile = process.platform === 'win32' ? '\\\\.\\pipe\\mypip' : '/tmp/unix.sock'

const server = net.createServer(接続 => {
  console.log('ソケットが接続されました。')
  connection.on('close', () => console.log('切断されました。'))
  接続.on('データ', データ => {
    console.log(`受信: ${data}`)
    接続.書き込み(データ)
    console.log(`送信: ${data}`)
  })
  connection.on('error', err => console.error(err.message))
})

試す {
  fs.unlinkSync(パイプファイル)
} キャッチ (エラー) {}

server.listen(パイプファイル)

client.js コードは次のとおりです。

定数net = require('net')

const pipeFile = process.platform === 'win32' ? '\\\\.\\pipe\\mypip' : '/tmp/unix.sock'

const クライアント = net.connect(パイプファイル)
client.on('connect', () => console.log('接続されました。'))
client.on('data', data => console.log(`receive: ${data}`))
client.on('end', () => console.log('切断されました。'))
client.on('error', err => console.error(err.message))

間隔を設定する(() => {
  定数メッセージ = 'hello'
  console.log(`送信: ${msg}`)
  クライアント.書き込み(メッセージ)
}, 3000)

操作効果:

$ ノードサーバー.js 
ソケットが接続されました。
受信: こんにちは
送信: こんにちは

$ ノードクライアント.js
接続されました。
送信: こんにちは
受信: こんにちは

要約する

2 つの Node.js プロセスが通信する方法についての記事はこれで終わりです。2 つの Node.js プロセスが通信する方法についての詳細は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Node.jsのchild_processモジュールから親子プロセス通信を学ぶ詳細な説明
  • ノードはプロセス通信を使用してクラスタ共有メモリを実装します

<<:  Dockerコンテナでユーザーを切り替えるときに権限が不足する問題を解決する方法

>>:  HTML テキスト ボックスの入力を数字と小数点のみに制限する

推薦する

MySQL ロックブロッキングの詳細な分析

日常のメンテナンスでは、スレッドがブロックされることが多く、データベースの応答が非常に遅くなります。...

Dockerイメージの作成とプロジェクト全体のワンクリックパッケージングとデプロイ

一般的な Dockerfile 命令の紹介命令説明するから新しいイメージが構築される基となるイメージ...

HTML ページ ソース コード レイアウトの概要_Powernode Java Academy

HTML ページ ソース コード レイアウトの概要この紹介では、Google のホームページのソー...

MySQL ロック(テーブルロック、行ロック、共有ロック、排他ロック、ギャップロック)の詳細な説明

現実世界では、鍵は外の世界から身を隠したいときに使用するツールです。コンピュータでは、複数のプロセス...

HTML入力ボックスの最適化により、ユーザーエクスペリエンスと使いやすさが向上します。

ユーザーエクスペリエンスと使いやすさを向上させるために、入力ボックスなど、Web ページでユーザーが...

MySQL 5.7 でルートパスワードを変更する方法

MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...

Docker イメージの作成、アップロード、プル、およびデプロイ操作 (Alibaba Cloud を使用)

学習プロセス中にプッシュ イメージが常にタイムアウトすることがわかったため、Alibaba Clou...

MySQLデッドロックの原因と解決策

データベースは、オペレーティング システムと同様に、複数のユーザーが使用する共有リソースです。複数の...

HTML の入力の readonly 属性と disabled 属性の違いについて簡単に説明します。

「読み取り専用」と「無効」はどちらも、ユーザーがフォーム フィールドの内容を変更できないようにしま...

Vue フロントエンドと Django バックエンドを使用して、一定期間内のデータをクエリする方法

序文開発プロセスでは、すべてのデータではなく特定の期間内のデータをクエリするなど、クエリのフィルタリ...

MySQL のファントムリード問題を解決する方法

目次序文1. ファントムリーディングとは何ですか? 2. ファントムリーディングの問題点は何ですか?...

過去2年間のユーザーエクスペリエンス

<br />国内のウェブサイトが本格的に普及し、ユーザーエクスペリエンスに重点が置かれる...

MySQL のインデックスにおける NULL の影響についての詳細な説明

序文私は多くのブログを読み、弊社の DBA を含む多くの人々が、MySql では列に null が含...

Vue の基本 MVVM、テンプレート構文、データバインディング

目次1. Vueの概要Vue公式サイトMVVM アーキテクチャ パターンVue の紹介2. Vueを...

モバイル署名機能を実装するJavaScript

この記事では、モバイル署名機能を実装するためのJavaScriptの具体的なコードを参考までに共有し...