GO: https://swimlanes.io Note Client: `send_request` *[auto]* Client -> Server: `HEADERS` frame Note Server: request accepted Note Client: `send_message` Client -> Server: `DATA` ... `DATA` frames Note Server: `recv_message` Note Client Server: Now you have to end stream from the client-side, and you can do this in two ways: 1. `send_message(message, end=True)` - last `DATA` frame will contain `END_STREAM` flag 2. `end()` - one extra frame will be sent, as shown below. It is better to avoid this way if possible. Note Client: `end` *(optional, read note above)* Client -> Server: `HEADERS[END_STREAM]` frame Note Server: `send_initial_metadata` *[auto]* You can send initial metadata even before receiving messages from the client. RPC success or failure in gRPC protocol is indicated in trailers. Client <- Server: `HEADERS` frame Note Client: `recv_initial_metadata` *[auto]* Note Server: `send_message` Client <- Server: `DATA` ... `DATA` frames Note Client: `recv_message` Note Server: `send_trailing_metadata` *[auto]* Client <- Server: `HEADERS` frame as trailers Note Client: `recv_trailing_metadata` *[auto]*