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
- Protocol Buffers i pliki .proto
- Implementowanie jednożądaniowej usługi gRPC
- Strumieniowanie po stronie serwera i klienta
- Interceptory gRPC i metadane