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

推薦する

UbuntuにProtobuf 3をインストールするための詳細なチュートリアル

いつインストールするかprotoc コマンドを使用しても Protoc が見つからない場合は、インス...

Mysql Explainコマンドの使用と分析

mysql explain コマンドは、MySQL がインデックスを使用して選択ステートメントを処理...

OR キーワードを使用した MySql 複数条件クエリ ステートメント

前の記事では、And キーワードを使用した MySql の複数条件クエリ ステートメントを紹介しまし...

JavaScript タイマーの詳細

目次1. 簡単な紹介2. 間隔を設定する2.1 説明2.2 パラメータ2.3 戻り値2.4 使用法3...

vue3 プロジェクトを素早く構築し、関連機能を紹介する vite+ts の詳細な説明

目次ヴィテ建てる構成vite.config.tsルーターtsタイプvue3 の知識設定小道具コンテク...

MySQL シリーズ 10 同時実行制御を実装するための MySQL トランザクション分離

目次1.同時アクセス制御2. 取引1. トランザクションは ACID 原則に従います。 2. トラン...

XHTML CSS ページをプリンタ ページに変換する

以前は、Web ページのプリンタ対応バージョンを作成するには、印刷したときに見栄えがよくなるようにレ...

Centos7でのMySQLインストールチュートリアル

MySQLインストールチュートリアル、参考までに具体的な内容は次のとおりです。 1. ダウンロードY...

MySQL での IN データボリュームの使用の最適化された記録

MySQL のバージョン番号は 5.7.28 です。テーブル A には 390 万件のレコードがあり...

Bash で山括弧を使用するその他の方法

序文この記事では、山括弧のその他の用途をさらに詳しく見ていきます。前回の記事では、山括弧 (<...

Centos7 での Mysql5.7.19 の詳細なインストールチュートリアル

1. ダウンロード公式サイトからmysql-5.7.19-linux-glibc2.12-x86_6...

ウェブデザイナーは3つの側面からウェブページを最適化する必要がある

<br />帯域幅の増加に伴い、Web ページ上のオブジェクトも増えているため、Web ...

MYSQL SERVER のログファイルを縮小する方法

トランザクション ログには、関連するデータベースに対する操作が記録され、データベースの回復に関連する...

mysql 8.0.16 winx64.zip インストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.16 winx64.zipのインストールと設定方法の具体的なコード...

Vue2とVue3の兄弟コンポーネント通信バスの違いと使い方

目次vue2.x vue3.x tiny-emitterプラグインの使用Mittプラグインの使用vu...