ماژول Net در Node.js

ماژول node:net یک API شبکهٔ ناهمگام برای ایجاد سرورهای TCP یا IPC و همچنین کلاینت‌ها فراهم می‌کند. این ماژول امکان کار با سوکت‌ها، مدیریت ارتباطات، و کنترل دسترسی به آدرس‌های IP را می‌دهد. از طریق کلاس‌هایی مانند net.Server, net.SocketAddress, و net.BlockList می‌توان رفتار شبکه را به‌طور دقیق مدیریت کرد.

TCP / IPCnet.createServer / net.createConnectionBlockListSocketAddressserver.listen / server.close

~7 دقیقه مطالعه • بروزرسانی ۹ دی ۱۴۰۴

1. معرفی


ماژول node:net برای ایجاد سرورهای مبتنی بر جریان (stream-based) و کلاینت‌ها استفاده می‌شود. این ماژول از طریق require('node:net') یا import 'node:net' در دسترس است.


2. پشتیبانی IPC


این ماژول از IPC با named pipes در ویندوز و Unix domain sockets در سیستم‌عامل‌های دیگر پشتیبانی می‌کند. مسیرها باید به‌طور صحیح مشخص شوند و در سیستم‌عامل‌های مختلف رفتار متفاوتی دارند.


3. کلاس net.BlockList


برای مسدود کردن آدرس‌ها یا محدوده‌های IP استفاده می‌شود:


  • addAddress(): افزودن یک آدرس IP.
  • addRange(): افزودن یک محدوده IP.
  • addSubnet(): افزودن یک subnet.
  • check(): بررسی اینکه آیا آدرس در لیست مسدود است.

const blockList = new net.BlockList();
blockList.addAddress('123.123.123.123');
console.log(blockList.check('123.123.123.123')); // true

4. کلاس net.SocketAddress


برای نمایش یک آدرس شبکه استفاده می‌شود. شامل ویژگی‌های address, family, port و flowlabel است. متد SocketAddress.parse() امکان تجزیه رشته‌های آدرس را فراهم می‌کند.


5. کلاس net.Server


برای ایجاد سرور TCP یا IPC استفاده می‌شود. این کلاس از EventEmitter ارث‌بری می‌کند و رویدادهای زیر را دارد:


  • close: هنگام بسته شدن سرور.
  • connection: هنگام ایجاد اتصال جدید.
  • error: هنگام وقوع خطا.
  • listening: هنگام آماده شدن سرور.
  • drop: وقتی تعداد اتصالات به حداکثر برسد.

6. متدهای مهم سرور


  • server.address(): بازگرداندن آدرس و پورت سرور.
  • server.close(): بستن سرور.
  • server.getConnections(): دریافت تعداد اتصالات فعال.
  • server.listen(): شروع به گوش دادن برای اتصالات.

const server = net.createServer((socket) => {
  socket.end('goodbye\n');
}).on('error', (err) => { throw err; });

server.listen(() => {
  console.log('opened server on', server.address());
});

7. گزینه‌های listen()


متد listen() می‌تواند برای TCP یا IPC استفاده شود و گزینه‌هایی مانند host, port, exclusive, reusePort, و signal را پشتیبانی می‌کند.


نتیجه‌گیری


ماژول node:net یکی از ابزارهای اصلی برای کار با شبکه در Node.js است. با استفاده از کلاس‌ها و متدهای آن می‌توان سرورهای TCP و IPC ایجاد کرد، ارتباطات را مدیریت نمود، و امنیت شبکه را با BlockList کنترل کرد.


1. server.listen()


این متد برای شروع گوش دادن سرور استفاده می‌شود:


  • server.listen(path[, backlog][, callback]): ایجاد سرور IPC روی مسیر مشخص.
  • server.listen([port[, host[, backlog]]][, callback]): ایجاد سرور TCP روی پورت و هاست مشخص.

اگر پورت مشخص نشود یا صفر باشد، سیستم‌عامل یک پورت آزاد اختصاص می‌دهد. اگر هاست مشخص نشود، سرور روی آدرس‌های عمومی IPv4 یا IPv6 گوش می‌دهد.


2. ویژگی‌های سرور


  • server.listening: بررسی می‌کند آیا سرور در حال گوش دادن است یا خیر.
  • server.maxConnections: حداکثر تعداد اتصالات مجاز.
  • server.dropMaxConnection: در حالت cluster، تعیین می‌کند آیا اتصالات اضافی بسته شوند یا به worker دیگر منتقل شوند.
  • server.ref(): مانع خروج برنامه می‌شود اگر این تنها سرور فعال باشد.
  • server.unref(): اجازه می‌دهد برنامه خارج شود حتی اگر این تنها سرور فعال باشد.

3. کلاس net.Socket


سوکت‌ها انتزاعی از TCP یا IPC هستند و برای ارتباط مستقیم با سرور یا کلاینت استفاده می‌شوند. می‌توان آن‌ها را به‌طور مستقیم ایجاد کرد یا از طریق رویدادهای سرور دریافت نمود.


const net = require('node:net');
const socket = new net.Socket();

4. گزینه‌های ساخت سوکت


  • allowHalfOpen: کنترل پایان ارتباط دوطرفه.
  • fd: استفاده از یک فایل دسکریپتور موجود.
  • onread: مدیریت داده‌های ورودی با callback.
  • signal: استفاده از AbortSignal برای نابود کردن سوکت.

5. رویدادهای سوکت


  • close: هنگام بسته شدن کامل سوکت.
  • connect: هنگام برقراری اتصال موفق.
  • connectionAttempt / connectionAttemptFailed / connectionAttemptTimeout: مدیریت تلاش‌های اتصال.
  • data: هنگام دریافت داده.
  • drain: وقتی بافر نوشتن خالی می‌شود.
  • end: پایان ارتباط از سمت مقابل.
  • error: هنگام وقوع خطا.
  • lookup: پس از resolve کردن نام هاست.
  • ready: سوکت آماده استفاده است.
  • timeout: هنگام بی‌فعالیتی طولانی.

6. ویژگی‌های سوکت


  • socket.address(): بازگرداندن آدرس و پورت سوکت.
  • socket.autoSelectFamilyAttemptedAddresses: لیست آدرس‌هایی که برای اتصال امتحان شده‌اند.
  • socket.bufferSize: اندازه بافر نوشتن (منسوخ).
  • socket.bytesRead: تعداد بایت‌های دریافت‌شده.

نتیجه‌گیری


ویژگی‌های پیشرفتهٔ سرور و سوکت در ماژول node:net امکان کنترل دقیق اتصالات، مدیریت ظرفیت، و تعامل مستقیم با کلاینت‌ها را فراهم می‌کند. این قابلیت‌ها برای ساخت برنامه‌های شبکه‌ای مقیاس‌پذیر و پایدار حیاتی هستند.


1. اتصال سوکت


سوکت‌ها می‌توانند با استفاده از socket.connect() به سرور متصل شوند. این متد از چندین امضا پشتیبانی می‌کند:


  • socket.connect(options[, connectListener]): اتصال TCP یا IPC با گزینه‌های سفارشی.
  • socket.connect(path[, connectListener]): اتصال IPC.
  • socket.connect(port[, host][, connectListener]): اتصال TCP.

هنگام موفقیت، رویداد connect منتشر می‌شود؛ در صورت خطا، رویداد error.


2. ارسال و دریافت داده


  • socket.write(data[, encoding][, callback]): ارسال داده به سرور.
  • socket.bytesWritten: تعداد بایت‌های ارسال‌شده.
  • socket.bytesRead: تعداد بایت‌های دریافت‌شده.

3. پایان و نابودی ارتباط


  • socket.end([data[, encoding]][, callback]): پایان نیمه‌دوطرفه ارتباط (ارسال FIN).
  • socket.destroy([error]): نابودی کامل ارتباط.
  • socket.destroySoon(): نابودی پس از ارسال داده‌های باقی‌مانده.
  • socket.resetAndDestroy(): بستن ارتباط TCP با ارسال RST.

4. مدیریت جریان داده


  • socket.pause(): توقف خواندن داده‌ها.
  • socket.resume(): ادامه خواندن داده‌ها.
  • socket.setEncoding([encoding]): تنظیم encoding برای داده‌های خوانده‌شده.

5. مدیریت زمان و پایداری


  • socket.setKeepAlive([enable][, initialDelay]): فعال‌سازی keep-alive.
  • socket.setNoDelay([noDelay]): فعال/غیرفعال کردن الگوریتم Nagle.
  • socket.setTimeout(timeout[, callback]): تنظیم زمان بی‌فعالیتی.
  • socket.timeout: مقدار زمان تنظیم‌شده.

6. آدرس‌های محلی و راه دور


  • socket.localAddress: آدرس IP محلی.
  • socket.localPort: پورت محلی.
  • socket.localFamily: خانواده IP محلی (IPv4 یا IPv6).
  • socket.remoteAddress: آدرس IP راه دور.
  • socket.remotePort: پورت راه دور.
  • socket.remoteFamily: خانواده IP راه دور.

7. وضعیت سوکت


  • socket.connecting: آیا سوکت در حال اتصال است.
  • socket.destroyed: آیا ارتباط نابود شده است.
  • socket.pending: آیا اتصال هنوز برقرار نشده است.
  • socket.readyState: وضعیت فعلی ارتباط (open, readOnly, writeOnly).

8. net.createConnection()


این متد یک سوکت جدید ایجاد کرده و بلافاصله اتصال را آغاز می‌کند. net.connect() یک alias برای این متد است.


نتیجه‌گیری


کلاس net.Socket در Node.js ابزار قدرتمندی برای مدیریت ارتباطات شبکه‌ای است. با استفاده از متدها و ویژگی‌های آن می‌توان کنترل کامل بر اتصال، ارسال و دریافت داده، مدیریت خطاها و وضعیت ارتباط داشت. این قابلیت‌ها برای توسعهٔ برنامه‌های شبکه‌ای پایدار و مقیاس‌پذیر ضروری هستند.


1. net.createConnection()


یک net.Socket جدید ایجاد کرده و بلافاصله اتصال را آغاز می‌کند. امضاهای پشتیبانی‌شده:


  • net.createConnection(options[, connectListener]): اتصال TCP یا IPC با گزینه‌های سفارشی.
  • net.createConnection(path[, connectListener]): اتصال IPC.
  • net.createConnection(port[, host][, connectListener]): اتصال TCP.

گزینه‌ها شامل timeout, onread, keepAlive, noDelay و غیره هستند. پارامتر connectListener به‌عنوان یک شنوندهٔ یک‌باره برای رویداد connect اضافه می‌شود.


// مثال کلاینت TCP
const net = require('node:net');
const client = net.createConnection({ port: 8124 }, () => {
  console.log('connected to server!');
  client.write('world!\r\n');
});
client.on('data', (data) => {
  console.log(data.toString());
  client.end();
});
client.on('end', () => {
  console.log('disconnected from server');
});

2. net.createServer()


برای ایجاد سرور TCP یا IPC استفاده می‌شود. گزینه‌ها شامل:


  • allowHalfOpen: کنترل ارتباط نیمه‌بسته.
  • keepAlive و keepAliveInitialDelay: فعال‌سازی keep-alive.
  • noDelay: غیرفعال کردن الگوریتم Nagle.
  • pauseOnConnect: توقف سوکت‌ها هنگام اتصال ورودی.
  • blockList: محدود کردن IPهای ورودی.

// مثال سرور Echo TCP
const net = require('node:net');
const server = net.createServer((c) => {
  console.log('client connected');
  c.on('end', () => {
    console.log('client disconnected');
  });
  c.write('hello\r\n');
  c.pipe(c);
});
server.on('error', (err) => { throw err; });
server.listen(8124, () => {
  console.log('server bound');
});

3. ابزارهای AutoSelectFamily


  • net.getDefaultAutoSelectFamily(): مقدار پیش‌فرض گزینهٔ autoSelectFamily را بازمی‌گرداند.
  • net.setDefaultAutoSelectFamily(value): مقدار پیش‌فرض را تنظیم می‌کند.
  • net.getDefaultAutoSelectFamilyAttemptTimeout(): مقدار پیش‌فرض زمان تلاش اتصال را بازمی‌گرداند.
  • net.setDefaultAutoSelectFamilyAttemptTimeout(value): مقدار زمان تلاش اتصال را تنظیم می‌کند.

4. ابزارهای اعتبارسنجی IP


  • net.isIP(input): بازمی‌گرداند 6 برای IPv6، 4 برای IPv4، یا 0 در غیر این صورت.
  • net.isIPv4(input): بررسی می‌کند آیا ورودی IPv4 معتبر است.
  • net.isIPv6(input): بررسی می‌کند آیا ورودی IPv6 معتبر است.

net.isIP('::1'); // 6
net.isIP('127.0.0.1'); // 4
net.isIPv4('127.0.0.1'); // true
net.isIPv6('::1'); // true

نتیجه‌گیری


ماژول net در Node.js ابزارهای قدرتمندی برای ایجاد کلاینت‌ها و سرورها، مدیریت اتصالات و اعتبارسنجی آدرس‌های IP فراهم می‌کند. با استفاده از net.createConnection(), net.createServer() و توابع کمکی، توسعه‌دهندگان می‌توانند برنامه‌های شبکه‌ای مقیاس‌پذیر با کنترل دقیق بر رفتار اتصال بسازند.


نوشته و پژوهش شده توسط دکتر شاهین صیامی