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}`);
});
説明
net.connect({ port: 8080, host: 'localhost' }, ...)
: ローカルホストの8080ポートに接続を試みます。接続が成功すると、コールバック関数が実行されます。client.write('Hello, server!')
: サーバーにデータを送信します。client.on('data', ...)
: サーバーからデータを受信したときに実行されるイベントリスナーです。client.end()
: サーバーへの接続を終了します。client.on('end', ...)
: サーバーとの接続が終了したときに実行されるイベントリスナーです。client.on('error', ...)
: エラーが発生したときに実行されるイベントリスナーです。
- エラー処理を適切に行うことが重要です。
- 非同期処理のため、イベントリスナーまたはコールバック関数を使用して接続の完了やデータ受信を処理します。
- 接続が成功すると、
net.Socket
オブジェクトが返され、それを使用してデータの送受信を行います。 net.connect()
は、サーバーに接続するためのクライアント側のコードで使用されます。
一般的なエラーとトラブルシューティング
- ECONNREFUSED (接続拒否)
- 原因
指定されたポートでサーバーが実行されていない、またはサーバーが接続を受け付けていない場合に発生します。 - トラブルシューティング
- サーバーが正しく起動しているか確認します。
- ポート番号が正しいか確認します。
- ファイアウォールが接続をブロックしていないか確認します。
- サーバー側のログを確認し、エラーメッセージがないか確認します。
- 原因
- ETIMEDOUT (接続タイムアウト)
- 原因
指定された時間内にサーバーに接続できなかった場合に発生します。 - トラブルシューティング
- サーバーが実行されているか確認します。
- ネットワーク接続が安定しているか確認します。
net.connect()
のtimeout
オプションを調整して、タイムアウト時間を延長します。- サーバーの処理負荷が高い場合、サーバー側の処理速度を改善します。
- 原因
- ENOTFOUND (ホストが見つからない)
- 原因
指定されたホスト名がDNSで解決できなかった場合に発生します。 - トラブルシューティング
- ホスト名が正しいか確認します。
- ネットワーク接続が安定しているか確認します。
- DNSサーバーの設定を確認します。
- IPアドレスで接続を試します。
- 原因
- EADDRINUSE (アドレスが使用中)
- 原因
localPort
オプションで指定されたポートがすでに他のプロセスで使用されている場合に発生します。 - トラブルシューティング
- 別のポート番号を使用します。
- ポートを使用しているプロセスを特定し、終了します。
localPort
オプションを省略し、OSに自動的にポートを割り当てさせます。
- 原因
- EADDRNOTAVAIL (アドレスが利用不可)
- 原因
localAddress
オプションで指定されたIPアドレスがローカルマシンに存在しない場合に発生します。 - トラブルシューティング
localAddress
オプションが正しいIPアドレスを参照しているか確認します。- ローカルマシンのネットワーク設定を確認します。
localAddress
オプションを省略して、OSに自動的にIPアドレスを割り当てさせます。
- 原因
- ESOCKETTIMEDOUT (ソケットタイムアウト)
- 原因
接続は成功したが、データの送受信中にタイムアウトが発生した場合に発生します。 - トラブルシューティング
- サーバー側の処理が遅延していないか確認します。
- ネットワークの安定性を確認します。
- ソケットのタイムアウト設定を調整します。
- 原因
- エラーハンドリングの不足
- 原因
net.connect()
で発生するエラーを適切に処理していないと、アプリケーションがクラッシュしたり、予期しない動作をしたりすることがあります。 - トラブルシューティング
client.on('error', ...)
イベントリスナーを使用して、エラーを適切に処理します。- エラーが発生した場合に、適切なログを出力し、デバッグを容易にします。
- 例外処理(
try...catch
)を使用して、予期しないエラーを捕捉します。
- 原因
- ポートスキャン
nmap
などのポートスキャンツールを使用して、サーバーのポートが開いているか確認します。 - サーバー側のログ
サーバー側のログを確認し、エラーメッセージや接続状況を確認します。 - ネットワーク監視ツール
tcpdump
やWireshark
などのネットワーク監視ツールを使用して、ネットワークトラフィックを監視します。 - ログ出力
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
を使用して、エラーの種類(ECONNREFUSED
、ETIMEDOUT
など)を判定します。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()
を使用します。