序文2 つの Node.js プロセスはどのように相互に通信するのでしょうか?ここでは 2 つのシナリオがあります。
最初のシナリオでは、通常、通信に TCP または HTTP が使用されますが、2 番目のシナリオには 2 つのサブシナリオがあります。
前者は組み込みの 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Dockerコンテナでユーザーを切り替えるときに権限が不足する問題を解決する方法
>>: HTML テキスト ボックスの入力を数字と小数点のみに制限する
いつインストールするかprotoc コマンドを使用しても Protoc が見つからない場合は、インス...
mysql explain コマンドは、MySQL がインデックスを使用して選択ステートメントを処理...
前の記事では、And キーワードを使用した MySql の複数条件クエリ ステートメントを紹介しまし...
目次1. 簡単な紹介2. 間隔を設定する2.1 説明2.2 パラメータ2.3 戻り値2.4 使用法3...
目次ヴィテ建てる構成vite.config.tsルーターtsタイプvue3 の知識設定小道具コンテク...
目次1.同時アクセス制御2. 取引1. トランザクションは ACID 原則に従います。 2. トラン...
以前は、Web ページのプリンタ対応バージョンを作成するには、印刷したときに見栄えがよくなるようにレ...
MySQLインストールチュートリアル、参考までに具体的な内容は次のとおりです。 1. ダウンロードY...
MySQL のバージョン番号は 5.7.28 です。テーブル A には 390 万件のレコードがあり...
序文この記事では、山括弧のその他の用途をさらに詳しく見ていきます。前回の記事では、山括弧 (<...
1. ダウンロード公式サイトからmysql-5.7.19-linux-glibc2.12-x86_6...
<br />帯域幅の増加に伴い、Web ページ上のオブジェクトも増えているため、Web ...
トランザクション ログには、関連するデータベースに対する操作が記録され、データベースの回復に関連する...
この記事では、MySQL 8.0.16 winx64.zipのインストールと設定方法の具体的なコード...
目次vue2.x vue3.x tiny-emitterプラグインの使用Mittプラグインの使用vu...