0Pricing
Go Academy · درس

البث من الخادم والعميل

البث ثنائي الاتجاه والتحكم في التدفق

البث من الخادم والعميل درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

أنواع البث في gRPC

يدعم gRPC ثلاثة أنماط بث إضافية إلى جانب النمط الأحادي: البث من الخادم (يرسل الخادم عدة رسائل)، والبث من العميل (يرسل العميل عدة رسائل)، والبث ثنائي الاتجاه (يبث الطرفان).

البث من الخادم في .proto

استخدموا الكلمة المفتاحية stream قبل نوع الاستجابة:

service EventService {
    rpc ListEvents (ListEventsRequest) returns (stream Event);
}

تنفيذ البث من الخادم

يرسل الخادم رسائل متعددة باستدعاء stream.Send()، ويُرجع nil عند الانتهاء:

func (s *server) ListEvents(req *pb.ListEventsRequest, stream pb.EventService_ListEventsServer) error {
    for _, event := range s.events {
        if err := stream.Send(event); err != nil { return err }
    }
    return nil
}

استقبال العميل لبث الخادم

يستدعي العميل Recv() في حلقة حتى الوصول إلى io.EOF:

stream, err := client.ListEvents(ctx, &pb.ListEventsRequest{})
for {
    event, err := stream.Recv()
    if err == io.EOF { break }
    if err != nil { log.Fatal(err) }
    fmt.Println(event)
}

البث من العميل في .proto

استخدموا stream قبل نوع الطلب:

service UploadService {
    rpc Upload (stream Chunk) returns (UploadResponse);
}

تنفيذ البث من العميل

يرسل العميل رسائل متعددة، ثم يغلق البث باستخدام CloseAndRecv:

stream, _ := client.Upload(ctx)
for _, chunk := range chunks {
    stream.Send(chunk)
}
resp, err := stream.CloseAndRecv()

استقبال الخادم لبث العميل

استدعوا stream.Recv() في حلقة حتى الوصول إلى io.EOF، ثم أعيدوا الاستجابة النهائية:

func (s *server) Upload(stream pb.UploadService_UploadServer) error {
    for {
        chunk, err := stream.Recv()
        if err == io.EOF {
            return stream.SendAndClose(&pb.UploadResponse{Received: total})
        }
        if err != nil { return err }
        total += len(chunk.Data)
    }
}

البث ثنائي الاتجاه

يمكن لكل من العميل والخادم الإرسال والاستقبال بشكل مستقل. صرّحوا باستخدام stream على الجانبين في .proto.

service ChatService {
    rpc Chat (stream Message) returns (stream Message);
}

تنفيذ الخادم للبث ثنائي الاتجاه

يستقبل الخادم داخل goroutine ويرسل بشكل مستقل:

func (s *server) Chat(stream pb.ChatService_ChatServer) error {
    for {
        msg, err := stream.Recv()
        if err == io.EOF { return nil }
        if err != nil { return err }
        stream.Send(&pb.Message{Text: "echo: " + msg.Text})
    }
}

التحكم في التدفق

يستخدم gRPC التحكم في التدفق ضمن HTTP/2 لمنع المرسلين السريعين من إغراق المستقبلين البطيئين. وتطبّق استدعاءات Recv() الضغط العكسي تلقائيًا — إذ يتوقف الإرسال عندما لا يقرأ المستقبل.

إلغاء السياق

مرّروا سياقًا يتضمن موعدًا نهائيًا أو إلغاءً إلى جميع استدعاءات البث. يُلغى البث عند اكتمال السياق، ما يؤدي إلى إرجاع Recv/Send خطأً.

اختبار سريع

كيف يشير خادم RPC الذي يبث من الخادم إلى أنه انتهى من الإرسال؟

مراجعة: البث في gRPC

النقاط الأساسية:

  • بث الخادم: الكلمة المفتاحية stream للاستجابة؛ ويستدعي الخادم Send()
  • بث العميل: الكلمة المفتاحية stream للطلب؛ ويستدعي العميل Send() ثم CloseAndRecv()
  • ثنائي الاتجاه: stream على الجانبين؛ وgoroutines مستقلة لـ Send وRecv
  • ينطبق إلغاء السياق على جميع استدعاءات البث

الأسئلة الشائعة

هل درس «البث من الخادم والعميل» مجاني؟

نعم — نص درس «البث من الخادم والعميل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «البث من الخادم والعميل»؟

البث ثنائي الاتجاه والتحكم في التدفق تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «البث من الخادم والعميل»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Protocol Buffers وملفات .proto
  2. تنفيذ خدمة gRPC أحادية الاتجاه
  3. البث من الخادم والعميل
  4. معترضات gRPC والبيانات الوصفية
← العودة إلى Go Academy