Netty لجافا: دليل شامل مع أمثلة عملية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هي Netty ولماذا تحتاجها؟

Netty هي مكتبة شبكات غير متزامنة (Asynchronous) للغة Java، تتيح لك بناء تطبيقات خادم وعميل عالية الأداء. تقوم بتجريد تعقيد العمل مع الـ Sockets والـ Threads و NIO (Non-blocking I/O)، وتوفر للمطور واجهة برمجة تطبيقات (API) بسيطة وقوية لبناء تطبيقات الشبكات.

لماذا تحتاج Netty؟

  • أداء عالٍ: Netty مبنية على Java NIO، مما يسمح بمعالجة آلاف الاتصالات المتزامنة دون الحاجة إلى إنشاء Thread منفصل لكل اتصال.
  • غير متزامنة: جميع عمليات الإدخال والإخراج لا تمنع تنفيذ الـ Thread، مما يعزز قابلية التوسع للتطبيقات.
  • سهولة الاستخدام: على الرغم من تعقيد التقنيات الأساسية، توفر Netty واجهة برمجة تطبيقات واضحة وموجزة.
  • مرونة: تعتمد بنية Netty على سلسلة من المعالجات (Pipeline)، مما يسهل إضافة أو إزالة أو تعديل منطق معالجة البيانات.
  • دعم بروتوكولات متعددة: تدعم Netty بشكل مدمج HTTP، WebSocket، SSL/TLS، UDP، والعديد من البروتوكولات الأخرى.

تُستخدم Netty على نطاق واسع في مشاريع مثل Apache Cassandra و Apache Spark و Elasticsearch و Twitter Finagle وغيرها الكثير.

تثبيت Netty

Netty هي مكتبة للغة Java، لذا يتم تثبيتها عبر نظام إدارة التبعيات مثل Maven أو Gradle. على عكس Python أو JavaScript، لا يوجد أمر pip install أو npm install هنا.

التثبيت عبر Maven

أضف التبعية التالية إلى ملف pom.xml:

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.109.Final</version>
</dependency>

التثبيت عبر Gradle

أضف إلى ملف build.gradle:

implementation 'io.netty:netty-all:4.1.109.Final'

التثبيت عبر Gradle (Kotlin DSL)

implementation("io.netty:netty-all:4.1.109.Final")

بعد إضافة التبعية، سيقوم بيئة التطوير المتكاملة (IDE) الخاصة بك (مثل IntelliJ IDEA أو Eclipse) بتحميل المكتبة تلقائيًا.

بداية سريعة: خادم HTTP بسيط

لنقم بإنشاء خادم HTTP بسيط يرد بـ "Hello, World!" على أي طلب.

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpResponse;
import io.netty.handler.codec.http.HttpVersion;
import io.netty.buffer.Unpooled;
import io.netty.util.CharsetUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class SimpleHttpServer {

    public static void main(String[] args) throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) {                    

توصيات