Node.js は、非常に人気のあるサーバーサイド JavaScript ランタイム環境です。ネットワーク プログラミング、特に存続期間の長い接続の実装に優れています。
ネットワーク プログラミングにおいて、長い接続とは、クライアントとサーバーがハートビート アクティビティを維持し、接続を閉じない状態を指します。従来の HTTP 要求/応答モデルと比較して、接続が長いと、ネットワーク効率とシステム パフォーマンスが向上します。たとえば、クライアントとサーバー間の長い接続を介してデータを送受信する場合、接続の確立と切断のオーバーヘッドが削減され、結果として生じるネットワーク遅延とシステム リソースの浪費を回避できます。
それでは、Node.js で長い接続を実装するにはどうすればよいでしょうか?
1. WebSocketを使用する
WebSocketは、全二重通信を実現するためにTCPプロトコルに基づいて構築されたプロトコルです。これは、クライアントとサーバーの間に長い接続を確立する方法を提供し、クライアントの要求とサーバーの応答だけでなく双方向の通信を可能にします。
Node.js では、ws ライブラリを使用して WebSocket 接続を実装できます。簡単な WebSocket の例を次に示します:
<code>const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', function connection(ws) { console.log('client connected'); ws.on('message', function incoming(message) { console.log('received: %s', message); }); ws.on('close', function close() { console.log('client disconnected'); }); });</code>
この例では、ポート 8080 でリッスンする WebSocket サーバーを作成します。クライアントがサーバーに接続すると、WebSocket サーバーはイベント ハンドラーを通じて接続コールバック関数を呼び出します。このコールバック関数では、クライアントから送信されたメッセージを受信するためのメッセージ イベント ハンドラーを登録できます。また、クライアントが切断されたときに処理する close イベント ハンドラーも登録しました。
2. TCP Socketを使用する
TCP Socketは、TCPプロトコルのソケット通信を実装するために使用されるNode.jsの基本モジュールです。 Node.jsではnetモジュールを使用してTCPソケットを操作できます。
以下は簡単な TCP ソケットの例です:
<code>const net = require('net'); const server = net.createServer(function(socket) { console.log('client connected'); socket.on('data', function(data) { console.log('received: ' + data); }); socket.on('end', function() { console.log('client disconnected'); }); }); server.listen(8080, function() { console.log('server started'); });</code>
この例では、ポート 8080 でリッスンする TCP ソケット サーバーを作成します。クライアントがサーバーに接続すると、ログを出力し、クライアントから送信されたデータを受信するデータ イベント ハンドラーを登録します。接続が終了すると、別のログが出力されます。
3. HTTP ロング ポーリングを使用する
HTTP ロング ポーリングは、Web アプリケーションで長時間の接続を確立するテクノロジーです。これは、HTTP プロトコルの長い接続メカニズムを通じて実装され、サーバーがクライアントにデータをプッシュできるようにします。
Node.js では、HTTP ロングポーリング接続を自分で実装できます。これは単純な HTTP ロング ポーリングの例です:
<code>const http = require('http'); const messages = []; http.createServer(function(req, res) { console.log('client connected'); if (req.method === 'POST') { let chunks = ''; req.on('data', function(chunk) { chunks += chunk; }); req.on('end', function() { messages.push(chunks); console.log('message received: ' + chunks); }); } else if (req.method === 'GET') { res.writeHead(200, { 'Content-Type': 'text/plain', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache' }); let lastMessageIndex = 0; function checkForNewMessages() { if (lastMessageIndex < messages.length) { res.write(messages.slice(lastMessageIndex).join('\n') + '\n'); lastMessageIndex = messages.length; } } setInterval(checkForNewMessages, 1000); checkForNewMessages(); } }).listen(8080);</code>
この例では、ポート 8080 でリッスンする HTTP サーバーを作成します。リクエストのメソッド (GET または POST) を確認することで、リクエストをロング ポーリング メカニズムに変換できます。ロングポーリングリクエストでは、200 レスポンスコード、Connection ヘッダー、および Cache-Control ヘッダーをクライアントに送信して、接続を維持することを示します。次に、setInterval 関数と checkForNewMessages 関数を使用して最新のメッセージを継続的に確認し、新しいメッセージがある場合はクライアントに送信します。
概要
Node.js では、WebSocket、TCP Socket、HTTP ロング ポーリングなどのさまざまなテクノロジを使用して長い接続を実装できます。具体的な選択は、アプリケーションのニーズと設計によって異なります。もちろん、Socket.IO など、より多くの機能と柔軟性を提供できる他のより高度なテクノロジもあります。
以上がNodejsの長い接続を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。