# Client Streaming — gRPC

Source: https://www.skillbyai.com/en/grpc/st-client

> Upload many messages, get one answer.

## Aggregation on the server

In **client streaming**, the client sends a sequence of messages and the server replies once, typically after processing them all: uploading batches of records, sending sensor readings, or streaming chunks of a file. The server reads the request iterator and returns a summary. Validate each message as it arrives and decide whether a bad item rejects the whole call or is reported in the response.

## Uploading items as a stream

Python sketch.

```python
# server: consume the iterator, return one response
def UploadItems(self, request_iterator, context):
    accepted = 0
    for item in request_iterator:
        if item.quantity <= 0:
            context.abort(grpc.StatusCode.INVALID_ARGUMENT, "quantity must be positive")
        save(item)
        accepted += 1
    return order_pb2.UploadItemsResponse(accepted=accepted)

# client: pass a generator of messages
def items():
    for row in csv_rows:
        yield order_pb2.OrderItem(product_id=row["sku"], quantity=int(row["qty"]))

response = stub.UploadItems(items(), timeout=60)
```

## Mind message size limits

gRPC limits message size (4 MB by default for receiving in many implementations); stream chunks instead of sending one huge message.

**Quiz:** When does a client-streaming RPC typically return its response?

- [ ] Never
- [ ] Before the first message
- [ ] Once per client message
- [x] After the server has read the client's stream

*Answer:* After the server has read the client's stream. One response at the end.
