Node.js net モジュール
Node.js のnetモジュールは、TCPまたはIPCに基づくサーバーとクライアントを作成するためのコアモジュールです。非同期ネットワークプログラミングの能力を提供し、チャットサーバーやプロキシサーバーなどのさまざまなネットワークアプリケーションを構築するために使用できます。
主な機能
- TCPサーバーとクライアントの作成
- IPC(プロセス間通信)サーバーとクライアントの作成
- ネットワーク接続とデータ転送の処理
- ネットワーク接続のライフサイクルの管理
基本的な使い方
TCPサーバーの作成
例
// 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 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: ハーフオープン接続を許可するかどうか。デフォルトは falsepauseOnConnect: 接続時にソケットを一時停止するかどうか。デフォルトは false
connectionListener: 'connection' イベントのリスナーとして自動設定されます
net.createConnection(options[, connectListener])
指定されたポートとホストへのTCP接続を作成します。
一般的な options:
port: 接続するポート(必須)host: 接続するホスト。デフォルトは 'localhost'localAddress: ネットワーク接続をバインドするためのローカルインターフェースfamily: IPプロトコルファミリー(4 または 6)
ネットワークソケット (Socket)
net.Socketnet モジュールのコアクラスであり、ネットワーク接続を表します。
よく使われるイベント
connect: 接続が正常に確立されたときに発生data: データを受信したときに発生end: 接続の相手側がFINパケットを送信したときに発生timeout: 接続が非アクティブのためにタイムアウトしたときに発生error: エラーが発生したときに発生close: ソケットが完全に閉じられたときに発生
よく使われるメソッド
write(data[, encoding][, callback]): ソケット上でデータを送信end([data][, encoding]): ソケットをハーフクローズdestroy(): このソケットでI/Oアクティビティが発生しないようにするpause(): データの読み取りを一時停止resume(): データの読み取りを再開
高度な応用
複数クライアント接続の処理
例
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);
タイムアウト処理
例
// 接続タイムアウトを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サーバーまたはクライアントとの接続を表し、送信、受信、接続のクローズに使用するさまざまなメソッドを含みます。 |
メソッド
| 番号 | メソッド & 説明 |
|---|---|
| 1 | net.createServer([options][, connectionListener]) TCPサーバーを作成します。引数 connectionListener は 'connection' イベントのリスナーを自動的に作成します。 |
| 2 | net.connect(options[, connectionListener]) 新しい 'net.Socket' を返し、指定されたアドレスとポートに接続します。 ソケットが確立されると、'connect' イベントが発生します。 |
| 3 | net.createConnection(options[, connectionListener]) ポート port とホスト host へのTCP接続を作成します。host のデフォルトは 'localhost' です。 |
| 4 | net.connect(port[, host][, connectListener]) ポートが port でホストが host のTCP接続を作成します。host のデフォルトは 'localhost' です。引数 connectListener は 'connect' イベントのリスナーとして追加されます。'net.Socket' を返します。 |
| 5 | net.createConnection(port[, host][, connectListener]) ポートが port でホストが host のTCP接続を作成します。host のデフォルトは 'localhost' です。引数 connectListener は 'connect' イベントのリスナーとして追加されます。'net.Socket' を返します。 |
| 6 | net.connect(path[, connectListener]) path に接続する unix ソケットを作成します。引数 connectListener は 'connect' イベントのリスナーとして追加されます。'net.Socket' を返します。 |
| 7 | net.createConnection(path[, connectListener]) path に接続する unix ソケットを作成します。引数 connectListener は 'connect' イベントのリスナーとして追加されます。'net.Socket' を返します。 |
| 8 | net.isIP(input) 入力がIPアドレスかどうかを検出します。IPV4 の場合は 4、IPV6 の場合は 6、その他の場合は 0 を返します。 |
| 9 | net.isIPv4(input) 入力されたアドレスがIPV4の場合は true を返し、それ以外の場合は false を返します。 |
| 10 | net.isIPv6(input) 入力されたアドレスがIPV6の場合は true を返し、それ以外の場合は false を返します。 |
net.Server
net.Server は通常、TCPまたはローカルサーバーを作成するために使用されます。
| 番号 | メソッド & 説明 |
|---|---|
| 1 | server.listen(port[, host][, backlog][, callback]) 指定されたポート port とホスト host の接続をリッスンします。デフォルトでは、host は任意のIPv4アドレス(INADDR_ANY)からの直接接続を受け入れます。ポート port が 0 の場合、ランダムなポートが割り当てられます。 |
| 2 | server.listen(path[, callback]) 指定された path の接続を通じて、ローカルソケットサーバーを起動します。 |
| 3 | server.listen(handle[, callback]) 指定されたハンドルで接続します。 |
| 4 | server.listen(options[, callback]) options のプロパティ:ポート port、ホスト host、backlog、およびオプションの引数 callback 関数。これらは一緒に server.listen(port, [host], [backlog], [callback]) を呼び出します。また、引数 path を使用して UNIX ソケットを指定することもできます。 |
| 5 | server.close([callback]) サーバーは新しい接続の受け入れを停止し、既存の接続を維持します。これは非同期関数で、すべての接続が終了するとサーバーは閉じられ、'close' イベントが発生します。 |
| 6 | server.address() オペレーティングシステムによってバインドされたアドレス、プロトコルファミリー名、およびサーバーポートを返します。 |
| 7 | server.unref() これがイベントシステム内で唯一のアクティブなサーバーである場合、unref を呼び出すとプログラムの終了が許可されます。 |
| 8 | server.ref() unref とは逆に、これが唯一のサーバーである場合、以前に unref されたサーバーで ref を呼び出してもプログラムは終了しません(デフォルトの動作)。サーバーがすでに ref されている場合、再度 ref を呼び出しても影響はありません。 |
| 9 | server.getConnections(callback) サーバーの現在のアクティブな接続数を非同期に取得します。ソケットが子プロセスに送信された後にのみ有効です。コールバック関数には err と count の2つのパラメータがあります。 |
イベント
| 番号 | イベント & 説明 |
|---|---|
| 1 | listening サーバーが server.listen を呼び出してバインドされた後に発生します。 |
| 2 | connection 新しい接続が作成されると発生します。socket は net.Socket インスタンスです。 |
| 3 | close サーバーが閉じられると発生します。接続が存在する場合、このイベントはすべての接続が閉じられるまで発生しないことに注意してください。 |
| 4 | error エラーが発生したときに発生します。'close' イベントはこのイベントの直後に呼び出されます。 |
net.Socket
net.Socket オブジェクトは、TCP または UNIX ソケットの抽象化です。net.Socket インスタンスは双方向ストリームインターフェースを実装しています。これらは、ユーザーがクライアントを作成するとき(connect() を使用)に使用することも、Node によって作成され、connection サーバーイベントを介してユーザーに渡されることもあります。
イベント
net.Socket イベントには次のものがあります:
| 番号 | イベント & 説明 |
|---|---|
| 1 | lookup ドメイン名の解決後、接続前にこのイベントが発生します。UNIX ソケットには適用されません。 |
| 2 | connect ソケット接続が正常に確立されたときに発生します。 |
| 3 | data データを受信したときに発生します。 |
| 4 | end ソケットの相手側が FIN パケットを送信したときに、このイベントが発生します。 |
| 5 | timeout ソケットがアイドルタイムアウトしたときに発生します。これはソケットがアイドル状態であることを示すだけです。ユーザーは手動で接続を閉じる必要があります。 |
| 6 | drain 書き込みキャッシュが空になったときに発生します。アップロードの制御に使用できます。 |
| 7 | error エラーが発生したときに発生します。 |
| 8 | close ソケットが完全に閉じられたときに発生します。引数 had_error はブール値で、転送エラーが原因でソケットが閉じられたかどうかを示します。 |
プロパティ
net.Socket はソケットの対話を制御するための便利なプロパティを多数提供します:
| 番号 | プロパティ & 説明 |
|---|---|
| 1 | socket.bufferSize このプロパティは、書き込みバッファに書き込まれるバイト数を示します。 |
| 2 | socket.remoteAddress リモートの IP アドレス文字列。例:'74.125.127.100' または '2001:4860:a005::68'。 |
| 3 | socket.remoteFamily リモートの IP プロトコルファミリ文字列。例:'IPv4' または 'IPv6'。 |
| 4 | socket.remotePort リモートポート。数値で表示。例:80 または 21。 |
| 5 | socket.localAddress ネットワーク接続がバインドされているローカルインターフェース。リモートクライアントが接続しているローカル IP アドレスの文字列表現。例えば、'0.0.0.0' でリッスンしていて、クライアントが '192.168.1.1' に接続している場合、この値は '192.168.1.1' になります。 |
| 6 | socket.localPort ローカルポートアドレス。数値で表示。例:80 または 21。 |
| 7 | socket.bytesRead 受信したバイト数。 |
| 8 | socket.bytesWritten 送信したバイト数。 |
メソッド
| 番号 | メソッド & 説明 |
|---|---|
| 1 | new net.Socket([options]) 新しいソケットオブジェクトを構築します。 |
| 2 | socket.connect(port[, host][, connectListener]) 指定されたポート port とホスト host でソケット接続を作成します。host パラメータはデフォルトで localhost です。通常、net.createConnection を使用してソケットを開く必要はありません。独自のソケットを実装した場合にのみ使用します。 |
| 3 | socket.connect(path[, connectListener]) 指定されたパスの UNIX ソケットを開きます。通常、net.createConnection を使用してソケットを開く必要はありません。独自のソケットを実装した場合にのみ使用します。 |
| 4 | socket.setEncoding([encoding]) エンコーディングを設定します。 |
| 5 | socket.write(data[, encoding][, callback]) ソケット上でデータを送信します。2番目のパラメータは文字列のエンコーディングを指定し、デフォルトは UTF8 エンコーディングです。 |
| 6 | socket.end([data][, encoding]) ソケットを半閉じします。例えば、FIN パケットを送信します。サーバーはまだデータを送信している可能性があります。 |
| 7 | socket.destroy() このソケット上でこれ以上の I/O アクティビティが発生しないようにします。エラーが発生した場合にのみ必要です。(エラーの処理など)。 |
| 8 | socket.pause() データの読み取りを一時停止します。つまり、data イベントは発生しなくなります。アップロードの制御に非常に役立ちます。 |
| 9 | socket.resume() pause() を呼び出した後、データの読み取りを再開します。 |
| 10 | socket.setTimeout(timeout[, callback]) ソケットが timeout ミリ秒間アクティビティがない場合、ソケットをタイムアウトに設定します。 |
| 11 | socket.setNoDelay([noDelay]) ネーグル(Nagle)アルゴリズムを無効にします。デフォルトでは TCP 接続はネーグルアルゴリズムを使用し、送信前にデータをバッファリングします。noDelay を true に設定すると、socket.write() を呼び出したときにデータがすぐに送信されます。noDelay のデフォルト値は true です。 |
| 12 | socket.setKeepAlive([enable][, initialDelay]) キープアライブ機能を無効/有効にし、アイドル状態のソケットで最初のキープアライブプローブを送信する前に、オプションで初期遅延を設定します。デフォルトは false です。 initialDelay(ミリ秒)を設定して、最後に受信したデータパケットと最初のキープアライブプローブとの間の遅延を設定します。initialDelay を 0 に設定すると、デフォルト(または以前の)値が保持されます。デフォルトは 0 です。 |
| 13 | socket.address() オペレーティングシステムは、バインドされたアドレス、プロトコルファミリ名、サーバーポートを返します。返されるオブジェクトには 3 つのプロパティがあります。例:{ port: 12346, family: 'IPv4', address: '127.0.0.1' }。 |
| 14 | socket.unref() これがイベントシステム内で唯一のアクティブなサーバーである場合、unref を呼び出すとプログラムが終了できるようになります。サーバーが既に unref されている場合、再度 unref を呼び出しても影響はありません。 |
| 15 | socket.ref() unref とは逆に、これが唯一のサーバーである場合、以前に unref されたサーバーで ref を呼び出すと、プログラムが終了しません(デフォルトの動作)。サーバーが既に ref されている場合、再度 ref を呼び出しても影響はありません。 |
例
server.js ファイルを作成し、コードは次のとおりです:
例
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 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 例によるデモ

実際の応用シーン
- チャットアプリケーション: リアルタイムチャットサーバーの構築
- ゲームサーバー: マルチプレイヤーのリアルタイムインタラクションの処理
- プロキシサーバー: クライアントリクエストの転送
- カスタムプロトコル: 特定のアプリケーション層プロトコルの実装
- IoTデバイス通信: 組み込みデバイスとの通信
ベストプラクティス
- エラーハンドリング: 常に 'error' イベントをリッスンする
- リソース管理: 使用しなくなった接続はすぐに閉じる
- パフォーマンスの考慮事項: 高並行処理シナリオでは、コネクションプールの使用を検討する
- セキュリティ: 適切な認証と暗号化メカニズムを実装する
- ロギング: 重要な接続イベントとデータを記録する
例
server.on('error', (err) => {
console.error('サーバーエラー:', err);
});
client.on('error', (err) => {
console.error('クライアントエラー:', err);
});
net モジュールを習得することで、さまざまな強力なネットワークアプリケーションを構築し、基盤となるネットワーク通信の原理を理解し、より高度なネットワークフレームワークを学ぶための確固たる基盤を築くことができます。
その他の拡張
Node.js 組み込みモジュール