0Pricing
Go Academy · บทเรียน

การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์

การสตรีมสองทิศทางและการควบคุมแรงดันย้อนกลับ

การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์ เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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);
}

การนำเซิร์ฟเวอร์แบบสองทิศทางไปใช้งาน

เซิร์ฟเวอร์รับข้อมูลในโกรูทีนหนึ่งและส่งข้อมูลอย่างอิสระ:

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 ทั้งสองฝั่ง ใช้โกรูทีน Send และ Recv แยกกัน
  • การยกเลิกบริบทมีผลกับการเรียกแบบสตรีมทั้งหมด

คำถามที่พบบ่อย

บทเรียน “การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์”

การสตรีมสองทิศทางและการควบคุมแรงดันย้อนกลับ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Protocol Buffers และไฟล์ .proto
  2. การใช้งานบริการ gRPC แบบเอกภาคี
  3. การสตรีมฝั่งเซิร์ฟเวอร์และไคลเอนต์
  4. อินเตอร์เซปเตอร์และข้อมูลเมทาดาทาของ gRPC
← กลับไปที่ Go Academy