1.unary 单程
2.stream:
- 双向 客户端(流)<-> 服务器端 send(流)
双方建立长链接,一方向另外一方推流的数据:
-
单向 客户端(流)<-> 服务器端(非流)
-
单向 客户端(非流)<-> 服务器端 send(流)
服务器端向客户端推流数据
proto:
service SayHello {
rpc TestClientRevStream(TestClientRevStreamReq) returns (stream TestClientRevStreamResponse) {};
}
message TestClientRevStreamReq {
string data = 1;
}
message TestClientRevStreamResponse {
string result = 1;
}
service:
def TestClientRevStream(self, request, context):
# 监听客户端是否是活还活着
index = 0
while context.is_active():
index += 1
time.sleep(1)
data = request.data
if data == 'close':
# 如检测到异常数据
context.cancel()
result = "server push :%s, index is :%s" % (data, index)
print(result)
yield pb2.TestClientRevStreamResponse(result=result)
client:
resp = client.TestClientRevStream(pb2.TestClientRevStreamReq(
data='close'
))
# print(resp.result)
for item in resp:
print(item.result)
客户端向服务器端推流
proto:
rpc TestClientStream(stream TestClientStreamReq) returns (TestClientStreamResponse) {};
message TestClientStreamReq {
string data = 1;
}
message TestClientStreamResponse {
string result = 1;
}
service:
def TestClientStream(self, request_iterator, context):
for idx, request in enumerate( request_iterator):
# 阻塞在这里
print(request.data)
# 服务器主动关闭
# if idx == 10:
# break
return pb2.TestClientStreamResponse(result='ok')
client:
def test_client_stream():
index=0
while 1:
time.sleep(1)
data = str(random.random())
index += 1
if index == 5:
break
yield pb2.TestClientStreamReq(
data=data
)
resp = client.TestClientStream(test_client_stream())
print(resp)
print(resp.result)
双向流与强制和友好断开与超时机制
client:
response = client.TestTowWayStream(test_client_stream(), timeout=2)
for res in response:
print(res.result)
service:
def TestTowWayStream(self, request_iterator, context):
# 双向流传输
index = 0
for request in request_iterator:
if index == 3:
# 强制断开连接
context.cancel()
index += 1
yield pb2.TestTowWayStreamResponse(result="server push : %s" % request.data)