序文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 テキスト ボックスの入力を数字と小数点のみに制限する
日常のメンテナンスでは、スレッドがブロックされることが多く、データベースの応答が非常に遅くなります。...
一般的な Dockerfile 命令の紹介命令説明するから新しいイメージが構築される基となるイメージ...
HTML ページ ソース コード レイアウトの概要この紹介では、Google のホームページのソー...
現実世界では、鍵は外の世界から身を隠したいときに使用するツールです。コンピュータでは、複数のプロセス...
ユーザーエクスペリエンスと使いやすさを向上させるために、入力ボックスなど、Web ページでユーザーが...
MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...
学習プロセス中にプッシュ イメージが常にタイムアウトすることがわかったため、Alibaba Clou...
データベースは、オペレーティング システムと同様に、複数のユーザーが使用する共有リソースです。複数の...
「読み取り専用」と「無効」はどちらも、ユーザーがフォーム フィールドの内容を変更できないようにしま...
序文開発プロセスでは、すべてのデータではなく特定の期間内のデータをクエリするなど、クエリのフィルタリ...
目次序文1. ファントムリーディングとは何ですか? 2. ファントムリーディングの問題点は何ですか?...
<br />国内のウェブサイトが本格的に普及し、ユーザーエクスペリエンスに重点が置かれる...
序文私は多くのブログを読み、弊社の DBA を含む多くの人々が、MySql では列に null が含...
目次1. Vueの概要Vue公式サイトMVVM アーキテクチャ パターンVue の紹介2. Vueを...
この記事では、モバイル署名機能を実装するためのJavaScriptの具体的なコードを参考までに共有し...