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

推薦する

JSはUUIDとNanoIDというユニークなIDメソッドを生成します

目次1. NanoIDがUUIDに取って代わる理由2. jsを生成する方法3. ナノID方式序文:ユ...

Windows に MySQL 5.7.18 の解凍バージョンをインストールするチュートリアル

1. インストールプロセスMySQL バージョン: 5.7.18 1. my.ini ファイル(簡易...

docker pullがリセットされる問題を解決する

この記事では、docker pull がリセットされる問題を解決する方法を紹介し、皆さんと共有します...

CSS で透明なグラデーション効果を実装するためのサンプルコード

Zhihu Discovery コラムのタイトル画像は、通常、以下のように表示されます。明らかに、グ...

HTML テーブルタグチュートリアル (7): 背景色属性 BGCOLOR

テーブルの背景色は、BGCOLOR 属性を通じて設定できます。基本的な構文<テーブル BGCO...

nginx における proxy_pass のさまざまな使用法の詳細な説明

目次プロキシ転送ルール最初のもの: 2番目のタイプ: 3番目のタイプ: 4番目のタイプ: 5番目:プ...

Douyin ロゴを作成する手順の CSS3 分析

「Tik Tok」も大人気で、ユーザー数は7億人と言われています。今日は、注目を集めるためにTikT...

WeChatアプレットがチャットルーム機能を実現

この記事では、参考のために、WeChatアプレットのチャットルームを実装するための具体的なコードを例...

UniappはBaidu Voiceを使用して録音をテキストに変換する機能を実現

3日間さまざまな困難に遭遇した後、ようやくこの機能を実現しました。正常に実装できる方法を見つける前に...

Vueフレームワークで習得しなければならない重要な知識を学びます

1. Vueとは何かVue は、ユーザー ページを構築するためのプログレッシブ フレームワークです。...

HTML における画像タグの使用方法の詳細な説明

HTML では、<img> タグはテキスト内の画像タグを定義するために使用されます。その...

Alibaba Cloud Server Ubuntu 設定チュートリアル

Alibaba Cloud のカスタム Ubuntu イメージのインポートには、OSS スナップショ...

MySqlのインストールとログインの詳細な説明

LinuxにMySQLがすでにインストールされているかどうかを確認する sudo service m...

jsシミュレーションでJingdongの詳細ページで画像を拡大する効果を実現

この記事では、Jingdongの詳細ページの画像の拡大を実現するためのjsの具体的なコードを紹介しま...

Jira リバース プロキシを実装するための nginx について

概要: nginx リバース プロキシ jira を構成し、https を実装します。Tomcat ...