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 テキスト ボックスの入力を数字と小数点のみに制限する

推薦する

ページ リファクタリング スキル - Javascript、CSS

JS、CSSについてCS: ...上部のスタイルシートCSS式を避ける外部JS、CSSの使用JSと...

MySql8.023 インストール プロセスの詳細なグラフィック説明 (初回インストール)

まず、MySQL公式サイトからインストールパッケージをダウンロードします。MySQLはオープンソース...

Vue でよく使われる命令 v-if と v-show の違いを簡単に分析します。

目次序文1.v-ショー2.v-if 3. v-showとv-ifの違い1. 原則の違い2. アプリケ...

入力タグの名前と値の違い

type はブラウザでの入力と出力に使用されるコントロールです (たとえば、type="t...

Google の新しい UI から学べること (画像とテキスト)

2011 年に最も顕著なウェブサイトの変更は、一連の製品に新しいユーザー インターフェースを導入した...

Win7 インストール MySQL 5.6 チュートリアル図

目次1. ダウンロード2. インストール3. my.ini ファイルを設定する(デフォルトのエンコー...

Linux プラットフォームでの Zabbix エージェントのインストールと設定方法

ここでは、Linux プラットフォームでの Zabbix エージェントのインストールと構成について簡...

Nginx ドメイン名の書き換えとワイルドカードドメイン名の解決を設定する方法

この記事では、ドメイン名の書き換えとワイルドカードドメイン名の解決を行うための Nginx の設定方...

Vue の基本入門: Vuex のインストールと使用

目次1. vuexとは何か2. インストールと導入3. vuexの使用4. プロセスの紹介5. 突然...

Zabbixを使用してMySQLを監視する方法

Zabbix 導入ドキュメントzabbix導入後zabbixエージェントの操作1. MySQLを監視...

MySQLインデックスが失敗するいくつかの状況の詳細な分析

1. 先頭のあいまいクエリではインデックスを使用できません (「%XX」や「%XX%」など)コード値...

ubuntu14.04 に jdk1.8 をインストールするチュートリアル

1. jdkダウンロードアドレスをダウンロードする我下載的是jdk-8u221-linux-x64....

Vue の get リクエストと post リクエストの違いのまとめ

このチュートリアルの動作環境: Windows 7 システム、vue 2.9.6 バージョン、DEL...

Linuxカーネルで中国語の文字を出力する方法

次のように、Windows/MacOS からログインした Linux の SSH ターミナルで簡単に...

シャドウソックスを使用してLAN透過ゲートウェイを構築する

目次dnsmasq をインストールして設定するChinaDNS をインストールして設定するshado...