gRPC: запуск и эксплуатация облачных приложений. Go и Java для Docker и Kubernetes [Индрасири Касун] (pdf) читать постранично, страница - 24

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

стороне клиента, когда поток закрывается после записи с помощью метода SendAndClose). При обнаружении конца клиентского
потока сервер закрывает этот поток со своей стороны, возвращая nil.
Клиентская реализация (листинг 3.12) тоже имеет много общего с предыдущими примерами. При вызове метода processOrders из объекта OrderMana­
gement клиент получает ссылку на поток (streamProcOrder ), с помощью
которой он отправляет свои сообщения и читает ответы, возвращаемые
сервером.
Листинг 3.12. Реализация клиента OrderManagement
с методом processOrders на Go
// обработка заказов
streamProcOrder, _ := c.ProcessOrders(ctx) 
if err := streamProcOrder.Send(
&wrapper.StringValue{Value:"102"}); err != nil { 
log.Fatalf("%v.Send(%v) = %v", client, "102", err)
}
if err := streamProcOrder.Send(
&wrapper.StringValue{Value:"103"}); err != nil {
log.Fatalf("%v.Send(%v) = %v", client, "103", err)
}
if err := streamProcOrder.Send(
&wrapper.StringValue{Value:"104"}); err != nil {
log.Fatalf("%v.Send(%v) = %v", client, "104", err)
}
channel := make(chan struct{}) 
go asncClientBidirectionalRPC(streamProcOrder, channel)
time.Sleep(time.Millisecond * 1000) 



Двунаправленный потоковый RPC   79

if err := streamProcOrder.Send(
&wrapper.StringValue{Value:"101"}); err != nil {
log.Fatalf("%v.Send(%v) = %v", client, "101", err)
}
if err := streamProcOrder.CloseSend(); err != nil {
log.Fatal(err)



}