0Pricing
Go Academy · Lekcja

Strumieniowanie po stronie serwera i klienta

Strumieniowanie dwukierunkowe i kontrola przepływu

Strumieniowanie po stronie serwera i klienta to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Typy strumieniowania gRPC

gRPC obsługuje trzy tryby strumieniowania oprócz unary: strumieniowanie serwerowe (serwer wysyła wiele komunikatów), strumieniowanie klienckie (klient wysyła wiele komunikatów) oraz strumieniowanie dwukierunkowe (obie strony strumieniują dane).

Strumieniowanie serwerowe w .proto

Należy użyć słowa kluczowego stream przed typem odpowiedzi:

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

Implementacja strumieniowania serwerowego

Serwer wysyła wiele komunikatów, wywołując stream.Send(), a po zakończeniu zwraca 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
}

Odbieranie strumienia serwera przez klienta

Klient wywołuje Recv() w pętli aż do 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)
}

Strumieniowanie klienckie w .proto

Należy użyć słowa kluczowego stream przed typem żądania:

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

Implementacja strumieniowania klienckiego

Klient wysyła wiele komunikatów, a następnie zamyka strumień za pomocą CloseAndRecv:

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

Odbieranie strumienia klienta przez serwer

Należy wywoływać stream.Recv() w pętli aż do io.EOF, a następnie zwrócić końcową odpowiedź:

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)
    }
}

Strumieniowanie dwukierunkowe

Klient i serwer mogą niezależnie wysyłać oraz odbierać dane. W pliku .proto należy zadeklarować stream po obu stronach.

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

Implementacja serwera dwukierunkowego strumieniowania

Serwer odbiera dane w goroutine i niezależnie je wysyła:

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})
    }
}

Kontrola przepływu

gRPC używa kontroli przepływu HTTP/2, aby zapobiec przeciążeniu wolnych odbiorców przez szybko wysyłających nadawców. Wywołania Recv() naturalnie zapewniają kontrolę wsteczną — wysyłanie zostaje zablokowane, gdy odbiorca nie odczytuje danych.

Anulowanie kontekstu

Do wszystkich wywołań strumieniowych należy przekazywać kontekst z limitem czasu lub możliwością anulowania. Strumień zostaje anulowany po zakończeniu kontekstu, co powoduje zwrócenie błędu przez Recv/Send.

Szybki test

W jaki sposób serwer RPC ze strumieniowaniem serwerowym sygnalizuje zakończenie wysyłania?

Podsumowanie: strumieniowanie gRPC

Najważniejsze informacje:

  • Strumień serwerowy: słowo kluczowe stream przy odpowiedzi; serwer wywołuje Send()
  • Strumień kliencki: słowo kluczowe stream przy żądaniu; klient wywołuje Send(), a następnie CloseAndRecv()
  • Dwukierunkowe: stream po obu stronach; niezależne goroutine dla Send i Recv
  • Anulowanie kontekstu dotyczy wszystkich wywołań strumieniowych

Często zadawane pytania

Czy lekcja „Strumieniowanie po stronie serwera i klienta” jest bezpłatna?

Tak — pełny tekst „Strumieniowanie po stronie serwera i klienta” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Strumieniowanie po stronie serwera i klienta”?

Strumieniowanie dwukierunkowe i kontrola przepływu Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Strumieniowanie po stronie serwera i klienta”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Protocol Buffers i pliki .proto
  2. Implementowanie jednożądaniowej usługi gRPC
  3. Strumieniowanie po stronie serwera i klienta
  4. Interceptory gRPC i metadane
← Powrót do Go Academy