Node.js net.connect() 完全解説:接続エラーから代替方法まで徹底網羅

2025-04-26

基本的な機能

  • 非同期処理
    net.connect()は非同期的に動作し、接続が確立されるまでプログラムの実行をブロックしません。接続が完了すると、コールバック関数またはイベントリスナーが呼び出されます。
  • ソケットオブジェクトの返却
    接続が成功すると、net.Socketオブジェクトが返されます。このソケットオブジェクトを使用して、データの送受信や接続の制御を行うことができます。
  • TCP接続の確立
    指定されたホストとポートに対してTCP接続を試みます。

構文

net.connect(options[, connectListener])
net.connect(port[, host][, connectListener])
  • connectListener: 接続が確立されたときに呼び出されるコールバック関数(省略可能)。
  • host: 接続先のホスト名またはIPアドレス(省略可能)。
  • port: 接続先のポート番号。
  • options: 接続オプションを含むオブジェクトです。
    • port: 接続先のポート番号。
    • host: 接続先のホスト名またはIPアドレス(省略可能)。
    • localAddress: ローカルインターフェースにバインドするためのローカルIPアドレス(省略可能)。
    • localPort: ローカルインターフェースにバインドするためのローカルポート(省略可能)。
    • family: IPスタックのバージョン。4または6。デフォルトは4
    • timeout: 接続タイムアウトまでのミリ秒数(省略可能)。


const net = require('net');

const client = net.connect({ port: 8080, host: 'localhost' }, () => {
  console.log('サーバーに接続しました!');
  client.write('Hello, server!');
});

client.on('data', (data) => {
  console.log(`サーバーからのデータ: ${data}`);
  client.end();
});

client.on('end', () => {
  console.log('サーバーとの接続が終了しました。');
});

client.on('error', (err) => {
  console.error(`エラーが発生しました: ${err}`);
});

説明

  1. net.connect({ port: 8080, host: 'localhost' }, ...): ローカルホストの8080ポートに接続を試みます。接続が成功すると、コールバック関数が実行されます。
  2. client.write('Hello, server!'): サーバーにデータを送信します。
  3. client.on('data', ...): サーバーからデータを受信したときに実行されるイベントリスナーです。
  4. client.end(): サーバーへの接続を終了します。
  5. client.on('end', ...): サーバーとの接続が終了したときに実行されるイベントリスナーです。
  6. client.on('error', ...): エラーが発生したときに実行されるイベントリスナーです。
  • エラー処理を適切に行うことが重要です。
  • 非同期処理のため、イベントリスナーまたはコールバック関数を使用して接続の完了やデータ受信を処理します。
  • 接続が成功すると、net.Socketオブジェクトが返され、それを使用してデータの送受信を行います。
  • net.connect()は、サーバーに接続するためのクライアント側のコードで使用されます。


一般的なエラーとトラブルシューティング

  1. ECONNREFUSED (接続拒否)
    • 原因
      指定されたポートでサーバーが実行されていない、またはサーバーが接続を受け付けていない場合に発生します。
    • トラブルシューティング
      • サーバーが正しく起動しているか確認します。
      • ポート番号が正しいか確認します。
      • ファイアウォールが接続をブロックしていないか確認します。
      • サーバー側のログを確認し、エラーメッセージがないか確認します。
  2. ETIMEDOUT (接続タイムアウト)
    • 原因
      指定された時間内にサーバーに接続できなかった場合に発生します。
    • トラブルシューティング
      • サーバーが実行されているか確認します。
      • ネットワーク接続が安定しているか確認します。
      • net.connect()timeoutオプションを調整して、タイムアウト時間を延長します。
      • サーバーの処理負荷が高い場合、サーバー側の処理速度を改善します。
  3. ENOTFOUND (ホストが見つからない)
    • 原因
      指定されたホスト名がDNSで解決できなかった場合に発生します。
    • トラブルシューティング
      • ホスト名が正しいか確認します。
      • ネットワーク接続が安定しているか確認します。
      • DNSサーバーの設定を確認します。
      • IPアドレスで接続を試します。
  4. EADDRINUSE (アドレスが使用中)
    • 原因
      localPortオプションで指定されたポートがすでに他のプロセスで使用されている場合に発生します。
    • トラブルシューティング
      • 別のポート番号を使用します。
      • ポートを使用しているプロセスを特定し、終了します。
      • localPortオプションを省略し、OSに自動的にポートを割り当てさせます。
  5. EADDRNOTAVAIL (アドレスが利用不可)
    • 原因
      localAddressオプションで指定されたIPアドレスがローカルマシンに存在しない場合に発生します。
    • トラブルシューティング
      • localAddressオプションが正しいIPアドレスを参照しているか確認します。
      • ローカルマシンのネットワーク設定を確認します。
      • localAddressオプションを省略して、OSに自動的にIPアドレスを割り当てさせます。
  6. ESOCKETTIMEDOUT (ソケットタイムアウト)
    • 原因
      接続は成功したが、データの送受信中にタイムアウトが発生した場合に発生します。
    • トラブルシューティング
      • サーバー側の処理が遅延していないか確認します。
      • ネットワークの安定性を確認します。
      • ソケットのタイムアウト設定を調整します。
  7. エラーハンドリングの不足
    • 原因
      net.connect()で発生するエラーを適切に処理していないと、アプリケーションがクラッシュしたり、予期しない動作をしたりすることがあります。
    • トラブルシューティング
      • client.on('error', ...)イベントリスナーを使用して、エラーを適切に処理します。
      • エラーが発生した場合に、適切なログを出力し、デバッグを容易にします。
      • 例外処理(try...catch)を使用して、予期しないエラーを捕捉します。
  • ポートスキャン
    nmapなどのポートスキャンツールを使用して、サーバーのポートが開いているか確認します。
  • サーバー側のログ
    サーバー側のログを確認し、エラーメッセージや接続状況を確認します。
  • ネットワーク監視ツール
    tcpdumpWiresharkなどのネットワーク監視ツールを使用して、ネットワークトラフィックを監視します。
  • ログ出力
    console.log()を使用して、接続状態やエラーメッセージをログに出力します。


例1: 基本的なクライアント接続とデータ送受信

const net = require('net');

const client = net.connect({ port: 8080, host: 'localhost' }, () => {
  console.log('サーバーに接続しました!');
  client.write('こんにちは、サーバー!'); // サーバーにデータを送信
});

client.on('data', (data) => {
  console.log(`サーバーからのデータ: ${data.toString()}`); // サーバーからのデータを受信
  client.end(); // 接続を終了
});

client.on('end', () => {
  console.log('サーバーとの接続が終了しました。');
});

client.on('error', (err) => {
  console.error(`エラーが発生しました: ${err}`);
});

説明

  • client.on('error', ...)で、エラーが発生した場合にエラーメッセージを表示します。
  • client.on('end', ...)で、接続が終了したことを通知します。
  • client.end()で、サーバーへの接続を終了します。
  • client.on('data', ...)で、サーバーから送信されたデータを受信し、コンソールに表示します。
  • client.write()を使用して、サーバーに「こんにちは、サーバー!」というデータを送信します。
  • 接続が成功すると、コールバック関数が実行され、「サーバーに接続しました!」と表示されます。
  • net.connect()を使用して、ローカルホストの8080ポートに接続します。

例2: タイムアウト設定とエラー処理

const net = require('net');

const options = {
  port: 8080,
  host: 'localhost',
  timeout: 2000, // 2秒のタイムアウトを設定
};

const client = net.connect(options, () => {
  console.log('サーバーに接続しました!');
  client.write('データ送信!');
});

client.on('data', (data) => {
  console.log(`サーバーからのデータ: ${data.toString()}`);
  client.end();
});

client.on('end', () => {
  console.log('サーバーとの接続が終了しました。');
});

client.on('error', (err) => {
  if (err.code === 'ECONNREFUSED') {
    console.error('サーバーへの接続が拒否されました。');
  } else if (err.code === 'ETIMEDOUT') {
    console.error('サーバーへの接続がタイムアウトしました。');
  } else {
    console.error(`エラーが発生しました: ${err}`);
  }
});

説明

  • err.codeを使用して、エラーの種類(ECONNREFUSEDETIMEDOUTなど)を判定します。
  • client.on('error', ...)で、エラーの種類に応じて異なるエラーメッセージを表示します。
  • timeout: 2000で、接続タイムアウトを2秒に設定します。
  • optionsオブジェクトを使用して、接続オプション(ポート、ホスト、タイムアウト)を設定します。

例3: 複数のクライアント接続とデータ送信

const net = require('net');

function connectAndSendData(port, host, message) {
  const client = net.connect({ port, host }, () => {
    console.log(`${host}:${port} に接続しました!`);
    client.write(message);
  });

  client.on('data', (data) => {
    console.log(`${host}:${port} からのデータ: ${data.toString()}`);
    client.end();
  });

  client.on('end', () => {
    console.log(`${host}:${port} との接続が終了しました。`);
  });

  client.on('error', (err) => {
    console.error(`${host}:${port} でエラーが発生しました: ${err}`);
  });
}

connectAndSendData(8080, 'localhost', 'メッセージ1');
connectAndSendData(8081, 'localhost', 'メッセージ2');
  • これにより、複数のクライアントが同時にサーバーに接続して通信する様子をシミュレートできます。
  • この関数を複数回呼び出して、異なるポートに同時に接続し、異なるメッセージを送信します。


net.createConnection()

  • 構文と使用例はnet.connect()と全く同じです。
  • コードの可読性を向上させるために、より明確な名前を使用したい場合に選択できます。
  • net.createConnection()net.connect()のエイリアスであり、完全に同じ機能を提供します。
const net = require('net');

const client = net.createConnection({ port: 8080, host: 'localhost' }, () => {
  console.log('サーバーに接続しました!');
  // ...
});

socket.connect()

  • これは、ソケットオブジェクトを事前に作成し、後で接続する場合に便利です。
  • net.Socketオブジェクトがすでに存在する場合、socket.connect()メソッドを使用して接続を確立できます。
const net = require('net');

const socket = new net.Socket();

socket.connect({ port: 8080, host: 'localhost' }, () => {
  console.log('サーバーに接続しました!');
  socket.write('データ送信');
});

socket.on('data', (data) => {
  console.log('受信データ: ' + data);
  socket.end();
});

socket.on('error', (err) => {
  console.error('エラー: ' + err);
});

tls.connect() (TLS/SSL接続)

  • tlsモジュールは、暗号化されたTCP接続を提供します。
  • 安全な通信が必要な場合、tls.connect()メソッドを使用してTLS/SSL接続を確立できます。
const tls = require('tls');

const options = {
  port: 443,
  host: 'example.com',
};

const client = tls.connect(options, () => {
  console.log('TLS接続が確立されました!');
  client.write('安全なデータを送信');
});

client.on('data', (data) => {
  console.log('受信データ: ' + data);
  client.end();
});

client.on('error', (err) => {
  console.error('TLSエラー: ' + err);
});

HTTP/HTTPSモジュール (http, https)

  • net.connect()よりも高レベルな抽象化を提供し、Webアプリケーションの開発に適しています。
  • これらのモジュールは、HTTPリクエストの作成とレスポンスの処理を簡素化します。
  • HTTPまたはHTTPSプロトコルを使用してWebサーバーと通信する場合、httpまたはhttpsモジュールを使用します。
const https = require('https');

https.get('https://example.com', (res) => {
  let data = '';
  res.on('data', (chunk) => {
    data += chunk;
  });
  res.on('end', () => {
    console.log(data);
  });
}).on('error', (err) => {
  console.error('HTTPSエラー: ' + err);
});

WebSocketモジュール (ws)

  • WebSocketは、双方向の通信を可能にし、チャットアプリケーションやリアルタイムゲームなどに適しています。
  • WebSocketプロトコルを使用してリアルタイム通信を行う場合、wsなどのWebSocketモジュールを使用します。
const WebSocket = require('ws');

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', () => {
  console.log('WebSocket接続が確立されました!');
  ws.send('WebSocketメッセージ');
});

ws.on('message', (message) => {
  console.log('受信メッセージ: ' + message);
});

ws.on('error', (err) => {
  console.error('WebSocketエラー: ' + err);
});
  • リアルタイム通信
    WebSocketモジュールを使用します。
  • HTTP/HTTPS通信
    httpまたはhttpsモジュールを使用します。
  • 安全な通信
    tls.connect()を使用します。
  • 既存のソケットを使用
    socket.connect()を使用します。
  • 単純なTCP接続
    net.connect()またはnet.createConnection()を使用します。