Node.js net モジュール

Java FileNode.js 組み込みモジュール


Node.js のnetモジュールは、TCPまたはIPCに基づくサーバーとクライアントを作成するためのコアモジュールです。非同期ネットワークプログラミングの能力を提供し、チャットサーバーやプロキシサーバーなどのさまざまなネットワークアプリケーションを構築するために使用できます。

主な機能

  1. TCPサーバーとクライアントの作成
  2. IPC(プロセス間通信)サーバーとクライアントの作成
  3. ネットワーク接続とデータ転送の処理
  4. ネットワーク接続のライフサイクルの管理

基本的な使い方

TCPサーバーの作成

例

const net = require('net');

// TCPサーバーを作成
const server = net.createServer((socket) => {
  console.log('クライアントが接続しました');
 
  // クライアントデータを受信
  socket.on('data', (data) => {
    console.log(`データを受信:: ${data}`);
    socket.write(`サーバーが受信:: ${data}`); // クライアントにデータを送信
  });
 
  // クライアントが接続を切断
  socket.on('end', () => {
    console.log('クライアントが切断されました');
  });
});

// 3000 ポートを監視
server.listen(3000, () => {
  console.log('サーバーは3000ポートを監視中です');
});

TCPクライアントの作成

例

const net = require('net');

// クライアントを作成してサーバーに接続
const client = net.createConnection({ port: 3000 }, () => {
  console.log('サーバーに接続しました');
  client.write('Hello Server!'); // サーバーにデータを送信
});

// サーバーデータを受信
client.on('data', (data) => {
  console.log(`サーバーデータを受信:: ${data}`);
  client.end(); // 接続を切断
});

client.on('end', () => {
  console.log('サーバーとの接続を切断しました');
});

コアAPIの詳細解説

net.createServer([options][, connectionListener])

新しいTCPまたはIPCサーバーを作成します。

引数:

  • options: オプションの設定オブジェクト
    • allowHalfOpen: ハーフオープン接続を許可するかどうか。デフォルトは false
    • pauseOnConnect: 接続時にソケットを一時停止するかどうか。デフォルトは false
  • connectionListener: 'connection' イベントのリスナーとして自動設定されます

net.createConnection(options[, connectListener])

指定されたポートとホストへのTCP接続を作成します。

一般的な options:

  • port: 接続するポート(必須)
  • host: 接続するホスト。デフォルトは 'localhost'
  • localAddress: ネットワーク接続をバインドするためのローカルインターフェース
  • family: IPプロトコルファミリー(4 または 6)

ネットワークソケット (Socket)

net.Socketnet モジュールのコアクラスであり、ネットワーク接続を表します。

よく使われるイベント

  1. connect: 接続が正常に確立されたときに発生
  2. data: データを受信したときに発生
  3. end: 接続の相手側がFINパケットを送信したときに発生
  4. timeout: 接続が非アクティブのためにタイムアウトしたときに発生
  5. error: エラーが発生したときに発生
  6. close: ソケットが完全に閉じられたときに発生

よく使われるメソッド

  1. write(data[, encoding][, callback]): ソケット上でデータを送信
  2. end([data][, encoding]): ソケットをハーフクローズ
  3. destroy(): このソケットでI/Oアクティビティが発生しないようにする
  4. pause(): データの読み取りを一時停止
  5. resume(): データの読み取りを再開

高度な応用

複数クライアント接続の処理

例

const net = require('net');

const server = net.createServer((socket) => {
  // 各接続に一意のIDを設定
  socket.id = Date.now();
 
  console.log(`クライアント ${socket.id}が接続されました`);
 
  socket.on('data', (data) => {
    console.log(`クライアント $から{socket.id}データを受信: ${data}`);
    // すべてのクライアントにメッセージをブロードキャスト
    server.getConnections((err, count) => {
      if (count > 1) {
        socket.write(`他に ${count-1}件のクライアントがオンラインです`);
      }
    });
  });
 
  socket.on('end', () => {
    console.log(`クライアント ${socket.id}が切断されました`);
  });
});

server.listen(3000);

タイムアウト処理

例

const server = net.createServer((socket) => {
  // 接続タイムアウトを5分に設定
  socket.setTimeout(5 * 60 * 1000);
 
  socket.on('timeout', () => {
    console.log('接続がタイムアウトしたため、切断します');
    socket.end();
  });
});

メソッドとプロパティ

機能説明
サーバーの作成net.createServer([options][, connectionListener]):TCPサーバーを作成するために使用され、接続要求をリッスンできます。
サーバーへの接続net.connect(options[, connectListener]) 或 net.createConnection(options[, connectListener]):指定されたサーバーに接続するために使用されます(クライアントを作成)。
Socket オブジェクトsocketオブジェクトはTCPサーバーまたはクライアントとの接続を表し、送信、受信、接続のクローズに使用するさまざまなメソッドを含みます。

メソッド

番号メソッド & 説明
1net.createServer([options][, connectionListener])
TCPサーバーを作成します。引数 connectionListener は 'connection' イベントのリスナーを自動的に作成します。
2net.connect(options[, connectionListener])
新しい 'net.Socket' を返し、指定されたアドレスとポートに接続します。
ソケットが確立されると、'connect' イベントが発生します。
3net.createConnection(options[, connectionListener])
ポート port とホスト host へのTCP接続を作成します。host のデフォルトは 'localhost' です。
4net.connect(port[, host][, connectListener])
ポートが port でホストが host のTCP接続を作成します。host のデフォルトは 'localhost' です。引数 connectListener は 'connect' イベントのリスナーとして追加されます。'net.Socket' を返します。
5net.createConnection(port[, host][, connectListener])
ポートが port でホストが host のTCP接続を作成します。host のデフォルトは 'localhost' です。引数 connectListener は 'connect' イベントのリスナーとして追加されます。'net.Socket' を返します。
6net.connect(path[, connectListener])
path に接続する unix ソケットを作成します。引数 connectListener は 'connect' イベントのリスナーとして追加されます。'net.Socket' を返します。
7net.createConnection(path[, connectListener])
path に接続する unix ソケットを作成します。引数 connectListener は 'connect' イベントのリスナーとして追加されます。'net.Socket' を返します。
8net.isIP(input)
入力がIPアドレスかどうかを検出します。IPV4 の場合は 4、IPV6 の場合は 6、その他の場合は 0 を返します。
9net.isIPv4(input)
入力されたアドレスがIPV4の場合は true を返し、それ以外の場合は false を返します。
10net.isIPv6(input)
入力されたアドレスがIPV6の場合は true を返し、それ以外の場合は false を返します。

net.Server

net.Server は通常、TCPまたはローカルサーバーを作成するために使用されます。

番号メソッド & 説明
1server.listen(port[, host][, backlog][, callback])
指定されたポート port とホスト host の接続をリッスンします。デフォルトでは、host は任意のIPv4アドレス(INADDR_ANY)からの直接接続を受け入れます。ポート port が 0 の場合、ランダムなポートが割り当てられます。
2server.listen(path[, callback])
指定された path の接続を通じて、ローカルソケットサーバーを起動します。
3server.listen(handle[, callback])
指定されたハンドルで接続します。
4server.listen(options[, callback])
options のプロパティ:ポート port、ホスト host、backlog、およびオプションの引数 callback 関数。これらは一緒に server.listen(port, [host], [backlog], [callback]) を呼び出します。また、引数 path を使用して UNIX ソケットを指定することもできます。
5server.close([callback])
サーバーは新しい接続の受け入れを停止し、既存の接続を維持します。これは非同期関数で、すべての接続が終了するとサーバーは閉じられ、'close' イベントが発生します。
6server.address()
オペレーティングシステムによってバインドされたアドレス、プロトコルファミリー名、およびサーバーポートを返します。
7server.unref()
これがイベントシステム内で唯一のアクティブなサーバーである場合、unref を呼び出すとプログラムの終了が許可されます。
8server.ref()
unref とは逆に、これが唯一のサーバーである場合、以前に unref されたサーバーで ref を呼び出してもプログラムは終了しません(デフォルトの動作)。サーバーがすでに ref されている場合、再度 ref を呼び出しても影響はありません。
9server.getConnections(callback)
サーバーの現在のアクティブな接続数を非同期に取得します。ソケットが子プロセスに送信された後にのみ有効です。コールバック関数には err と count の2つのパラメータがあります。

イベント

番号イベント & 説明
1listening
サーバーが server.listen を呼び出してバインドされた後に発生します。
2connection
新しい接続が作成されると発生します。socket は net.Socket インスタンスです。
3close
サーバーが閉じられると発生します。接続が存在する場合、このイベントはすべての接続が閉じられるまで発生しないことに注意してください。
4error
エラーが発生したときに発生します。'close' イベントはこのイベントの直後に呼び出されます。

net.Socket

net.Socket オブジェクトは、TCP または UNIX ソケットの抽象化です。net.Socket インスタンスは双方向ストリームインターフェースを実装しています。これらは、ユーザーがクライアントを作成するとき(connect() を使用)に使用することも、Node によって作成され、connection サーバーイベントを介してユーザーに渡されることもあります。

イベント

net.Socket イベントには次のものがあります:

番号イベント & 説明
1lookup
ドメイン名の解決後、接続前にこのイベントが発生します。UNIX ソケットには適用されません。
2connect
ソケット接続が正常に確立されたときに発生します。
3data
データを受信したときに発生します。
4end
ソケットの相手側が FIN パケットを送信したときに、このイベントが発生します。
5timeout
ソケットがアイドルタイムアウトしたときに発生します。これはソケットがアイドル状態であることを示すだけです。ユーザーは手動で接続を閉じる必要があります。
6drain
書き込みキャッシュが空になったときに発生します。アップロードの制御に使用できます。
7error
エラーが発生したときに発生します。
8close
ソケットが完全に閉じられたときに発生します。引数 had_error はブール値で、転送エラーが原因でソケットが閉じられたかどうかを示します。

プロパティ

net.Socket はソケットの対話を制御するための便利なプロパティを多数提供します:

番号プロパティ & 説明
1socket.bufferSize
このプロパティは、書き込みバッファに書き込まれるバイト数を示します。
2socket.remoteAddress
リモートの IP アドレス文字列。例:'74.125.127.100' または '2001:4860:a005::68'。
3socket.remoteFamily
リモートの IP プロトコルファミリ文字列。例:'IPv4' または 'IPv6'。
4socket.remotePort
リモートポート。数値で表示。例:80 または 21。
5socket.localAddress
ネットワーク接続がバインドされているローカルインターフェース。リモートクライアントが接続しているローカル IP アドレスの文字列表現。例えば、'0.0.0.0' でリッスンしていて、クライアントが '192.168.1.1' に接続している場合、この値は '192.168.1.1' になります。
6socket.localPort
ローカルポートアドレス。数値で表示。例:80 または 21。
7socket.bytesRead
受信したバイト数。
8socket.bytesWritten
送信したバイト数。

メソッド

番号メソッド & 説明
1new net.Socket([options])
新しいソケットオブジェクトを構築します。
2socket.connect(port[, host][, connectListener])
指定されたポート port とホスト host でソケット接続を作成します。host パラメータはデフォルトで localhost です。通常、net.createConnection を使用してソケットを開く必要はありません。独自のソケットを実装した場合にのみ使用します。
3socket.connect(path[, connectListener])
指定されたパスの UNIX ソケットを開きます。通常、net.createConnection を使用してソケットを開く必要はありません。独自のソケットを実装した場合にのみ使用します。
4socket.setEncoding([encoding])
エンコーディングを設定します。
5socket.write(data[, encoding][, callback])
ソケット上でデータを送信します。2番目のパラメータは文字列のエンコーディングを指定し、デフォルトは UTF8 エンコーディングです。
6socket.end([data][, encoding])
ソケットを半閉じします。例えば、FIN パケットを送信します。サーバーはまだデータを送信している可能性があります。
7socket.destroy()
このソケット上でこれ以上の I/O アクティビティが発生しないようにします。エラーが発生した場合にのみ必要です。(エラーの処理など)。
8socket.pause()
データの読み取りを一時停止します。つまり、data イベントは発生しなくなります。アップロードの制御に非常に役立ちます。
9socket.resume()
pause() を呼び出した後、データの読み取りを再開します。
10socket.setTimeout(timeout[, callback])
ソケットが timeout ミリ秒間アクティビティがない場合、ソケットをタイムアウトに設定します。
11socket.setNoDelay([noDelay])
ネーグル(Nagle)アルゴリズムを無効にします。デフォルトでは TCP 接続はネーグルアルゴリズムを使用し、送信前にデータをバッファリングします。noDelay を true に設定すると、socket.write() を呼び出したときにデータがすぐに送信されます。noDelay のデフォルト値は true です。
12socket.setKeepAlive([enable][, initialDelay])
キープアライブ機能を無効/有効にし、アイドル状態のソケットで最初のキープアライブプローブを送信する前に、オプションで初期遅延を設定します。デフォルトは false です。 initialDelay(ミリ秒)を設定して、最後に受信したデータパケットと最初のキープアライブプローブとの間の遅延を設定します。initialDelay を 0 に設定すると、デフォルト(または以前の)値が保持されます。デフォルトは 0 です。
13socket.address()
オペレーティングシステムは、バインドされたアドレス、プロトコルファミリ名、サーバーポートを返します。返されるオブジェクトには 3 つのプロパティがあります。例:{ port: 12346, family: 'IPv4', address: '127.0.0.1' }。
14socket.unref()
これがイベントシステム内で唯一のアクティブなサーバーである場合、unref を呼び出すとプログラムが終了できるようになります。サーバーが既に unref されている場合、再度 unref を呼び出しても影響はありません。
15socket.ref()
unref とは逆に、これが唯一のサーバーである場合、以前に unref されたサーバーで ref を呼び出すと、プログラムが終了しません(デフォルトの動作)。サーバーが既に ref されている場合、再度 ref を呼び出しても影響はありません。

例

server.js ファイルを作成し、コードは次のとおりです:

例

var net = require('net');
var server = net.createServer(function(connection) {
   console.log('client connected');
   connection.on('end', function() {
      console.log('クライアントが接続を閉じました');
   });
   connection.write('Hello World!\r\n');
   connection.pipe(connection);
});
server.listen(8080, function() {
  console.log('server is listening');
});

上記のサーバーコードを実行します:

$ node server.js
server is listening   # 服务已创建并监听 8080 端口

新しいウィンドウを開き、client.js ファイルを作成します。コードは次のとおりです:

例

var net = require('net');
var client = net.connect({port: 8080}, function() {
   console.log('サーバーに接続しました!');  
});
client.on('data', function(data) {
   console.log(data.toString());
   client.end();
});
client.on('end', function() {
   console.log('サーバーとの接続を切断しました');
});

上記のクライアントコードを実行します:

连接到服务器!
Hello World!

断开与服务器的连接

Gif 例によるデモ


実際の応用シーン

  1. チャットアプリケーション: リアルタイムチャットサーバーの構築
  2. ゲームサーバー: マルチプレイヤーのリアルタイムインタラクションの処理
  3. プロキシサーバー: クライアントリクエストの転送
  4. カスタムプロトコル: 特定のアプリケーション層プロトコルの実装
  5. IoTデバイス通信: 組み込みデバイスとの通信

ベストプラクティス

  1. エラーハンドリング: 常に 'error' イベントをリッスンする
  2. リソース管理: 使用しなくなった接続はすぐに閉じる
  3. パフォーマンスの考慮事項: 高並行処理シナリオでは、コネクションプールの使用を検討する
  4. セキュリティ: 適切な認証と暗号化メカニズムを実装する
  5. ロギング: 重要な接続イベントとデータを記録する

例

// 例: 完全なエラーハンドリング
server.on('error', (err) => {
  console.error('サーバーエラー:', err);
});

client.on('error', (err) => {
  console.error('クライアントエラー:', err);
});

net モジュールを習得することで、さまざまな強力なネットワークアプリケーションを構築し、基盤となるネットワーク通信の原理を理解し、より高度なネットワークフレームワークを学ぶための確固たる基盤を築くことができます。

Java FileNode.js 組み込みモジュール

その他の拡張