xref: /aosp_15_r20/external/grpc-grpc/examples/python/data_transmission/client.py (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2019 gRPC authors.
2*cc02d7e2SAndroid Build Coastguard Worker#
3*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*cc02d7e2SAndroid Build Coastguard Worker#
7*cc02d7e2SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*cc02d7e2SAndroid Build Coastguard Worker#
9*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License.
14*cc02d7e2SAndroid Build Coastguard Worker"""The example of four ways of data transmission using gRPC in Python."""
15*cc02d7e2SAndroid Build Coastguard Worker
16*cc02d7e2SAndroid Build Coastguard Workerimport time
17*cc02d7e2SAndroid Build Coastguard Worker
18*cc02d7e2SAndroid Build Coastguard Workerimport grpc
19*cc02d7e2SAndroid Build Coastguard Worker
20*cc02d7e2SAndroid Build Coastguard Workerimport demo_pb2
21*cc02d7e2SAndroid Build Coastguard Workerimport demo_pb2_grpc
22*cc02d7e2SAndroid Build Coastguard Worker
23*cc02d7e2SAndroid Build Coastguard Worker__all__ = [
24*cc02d7e2SAndroid Build Coastguard Worker    "simple_method",
25*cc02d7e2SAndroid Build Coastguard Worker    "client_streaming_method",
26*cc02d7e2SAndroid Build Coastguard Worker    "server_streaming_method",
27*cc02d7e2SAndroid Build Coastguard Worker    "bidirectional_streaming_method",
28*cc02d7e2SAndroid Build Coastguard Worker]
29*cc02d7e2SAndroid Build Coastguard Worker
30*cc02d7e2SAndroid Build Coastguard WorkerSERVER_ADDRESS = "localhost:23333"
31*cc02d7e2SAndroid Build Coastguard WorkerCLIENT_ID = 1
32*cc02d7e2SAndroid Build Coastguard Worker
33*cc02d7e2SAndroid Build Coastguard Worker# 中文注释和英文翻译
34*cc02d7e2SAndroid Build Coastguard Worker# Note that this example was contributed by an external user using Chinese comments.
35*cc02d7e2SAndroid Build Coastguard Worker# In all cases, the Chinese comment text is translated to English just below it.
36*cc02d7e2SAndroid Build Coastguard Worker
37*cc02d7e2SAndroid Build Coastguard Worker
38*cc02d7e2SAndroid Build Coastguard Worker# 一元模式(在一次调用中, 客户端只能向服务器传输一次请求数据, 服务器也只能返回一次响应)
39*cc02d7e2SAndroid Build Coastguard Worker# unary-unary(In a single call, the client can only send request once, and the server can
40*cc02d7e2SAndroid Build Coastguard Worker# only respond once.)
41*cc02d7e2SAndroid Build Coastguard Workerdef simple_method(stub):
42*cc02d7e2SAndroid Build Coastguard Worker    print("--------------Call SimpleMethod Begin--------------")
43*cc02d7e2SAndroid Build Coastguard Worker    request = demo_pb2.Request(
44*cc02d7e2SAndroid Build Coastguard Worker        client_id=CLIENT_ID, request_data="called by Python client"
45*cc02d7e2SAndroid Build Coastguard Worker    )
46*cc02d7e2SAndroid Build Coastguard Worker    response = stub.SimpleMethod(request)
47*cc02d7e2SAndroid Build Coastguard Worker    print(
48*cc02d7e2SAndroid Build Coastguard Worker        "resp from server(%d), the message=%s"
49*cc02d7e2SAndroid Build Coastguard Worker        % (response.server_id, response.response_data)
50*cc02d7e2SAndroid Build Coastguard Worker    )
51*cc02d7e2SAndroid Build Coastguard Worker    print("--------------Call SimpleMethod Over---------------")
52*cc02d7e2SAndroid Build Coastguard Worker
53*cc02d7e2SAndroid Build Coastguard Worker
54*cc02d7e2SAndroid Build Coastguard Worker# 客户端流模式(在一次调用中, 客户端可以多次向服务器传输数据, 但是服务器只能返回一次响应)
55*cc02d7e2SAndroid Build Coastguard Worker# stream-unary (In a single call, the client can transfer data to the server several times,
56*cc02d7e2SAndroid Build Coastguard Worker# but the server can only return a response once.)
57*cc02d7e2SAndroid Build Coastguard Workerdef client_streaming_method(stub):
58*cc02d7e2SAndroid Build Coastguard Worker    print("--------------Call ClientStreamingMethod Begin--------------")
59*cc02d7e2SAndroid Build Coastguard Worker
60*cc02d7e2SAndroid Build Coastguard Worker    # 创建一个生成器
61*cc02d7e2SAndroid Build Coastguard Worker    # create a generator
62*cc02d7e2SAndroid Build Coastguard Worker    def request_messages():
63*cc02d7e2SAndroid Build Coastguard Worker        for i in range(5):
64*cc02d7e2SAndroid Build Coastguard Worker            request = demo_pb2.Request(
65*cc02d7e2SAndroid Build Coastguard Worker                client_id=CLIENT_ID,
66*cc02d7e2SAndroid Build Coastguard Worker                request_data="called by Python client, message:%d" % i,
67*cc02d7e2SAndroid Build Coastguard Worker            )
68*cc02d7e2SAndroid Build Coastguard Worker            yield request
69*cc02d7e2SAndroid Build Coastguard Worker
70*cc02d7e2SAndroid Build Coastguard Worker    response = stub.ClientStreamingMethod(request_messages())
71*cc02d7e2SAndroid Build Coastguard Worker    print(
72*cc02d7e2SAndroid Build Coastguard Worker        "resp from server(%d), the message=%s"
73*cc02d7e2SAndroid Build Coastguard Worker        % (response.server_id, response.response_data)
74*cc02d7e2SAndroid Build Coastguard Worker    )
75*cc02d7e2SAndroid Build Coastguard Worker    print("--------------Call ClientStreamingMethod Over---------------")
76*cc02d7e2SAndroid Build Coastguard Worker
77*cc02d7e2SAndroid Build Coastguard Worker
78*cc02d7e2SAndroid Build Coastguard Worker# 服务端流模式(在一次调用中, 客户端只能一次向服务器传输数据, 但是服务器可以多次返回响应)
79*cc02d7e2SAndroid Build Coastguard Worker# unary-stream (In a single call, the client can only transmit data to the server at one time,
80*cc02d7e2SAndroid Build Coastguard Worker# but the server can return the response many times.)
81*cc02d7e2SAndroid Build Coastguard Workerdef server_streaming_method(stub):
82*cc02d7e2SAndroid Build Coastguard Worker    print("--------------Call ServerStreamingMethod Begin--------------")
83*cc02d7e2SAndroid Build Coastguard Worker    request = demo_pb2.Request(
84*cc02d7e2SAndroid Build Coastguard Worker        client_id=CLIENT_ID, request_data="called by Python client"
85*cc02d7e2SAndroid Build Coastguard Worker    )
86*cc02d7e2SAndroid Build Coastguard Worker    response_iterator = stub.ServerStreamingMethod(request)
87*cc02d7e2SAndroid Build Coastguard Worker    for response in response_iterator:
88*cc02d7e2SAndroid Build Coastguard Worker        print(
89*cc02d7e2SAndroid Build Coastguard Worker            "recv from server(%d), message=%s"
90*cc02d7e2SAndroid Build Coastguard Worker            % (response.server_id, response.response_data)
91*cc02d7e2SAndroid Build Coastguard Worker        )
92*cc02d7e2SAndroid Build Coastguard Worker
93*cc02d7e2SAndroid Build Coastguard Worker    print("--------------Call ServerStreamingMethod Over---------------")
94*cc02d7e2SAndroid Build Coastguard Worker
95*cc02d7e2SAndroid Build Coastguard Worker
96*cc02d7e2SAndroid Build Coastguard Worker# 双向流模式 (在一次调用中, 客户端和服务器都可以向对方多次收发数据)
97*cc02d7e2SAndroid Build Coastguard Worker# stream-stream (In a single call, both client and server can send and receive data
98*cc02d7e2SAndroid Build Coastguard Worker# to each other multiple times.)
99*cc02d7e2SAndroid Build Coastguard Workerdef bidirectional_streaming_method(stub):
100*cc02d7e2SAndroid Build Coastguard Worker    print(
101*cc02d7e2SAndroid Build Coastguard Worker        "--------------Call BidirectionalStreamingMethod Begin---------------"
102*cc02d7e2SAndroid Build Coastguard Worker    )
103*cc02d7e2SAndroid Build Coastguard Worker
104*cc02d7e2SAndroid Build Coastguard Worker    # 创建一个生成器
105*cc02d7e2SAndroid Build Coastguard Worker    # create a generator
106*cc02d7e2SAndroid Build Coastguard Worker    def request_messages():
107*cc02d7e2SAndroid Build Coastguard Worker        for i in range(5):
108*cc02d7e2SAndroid Build Coastguard Worker            request = demo_pb2.Request(
109*cc02d7e2SAndroid Build Coastguard Worker                client_id=CLIENT_ID,
110*cc02d7e2SAndroid Build Coastguard Worker                request_data="called by Python client, message: %d" % i,
111*cc02d7e2SAndroid Build Coastguard Worker            )
112*cc02d7e2SAndroid Build Coastguard Worker            yield request
113*cc02d7e2SAndroid Build Coastguard Worker            time.sleep(1)
114*cc02d7e2SAndroid Build Coastguard Worker
115*cc02d7e2SAndroid Build Coastguard Worker    response_iterator = stub.BidirectionalStreamingMethod(request_messages())
116*cc02d7e2SAndroid Build Coastguard Worker    for response in response_iterator:
117*cc02d7e2SAndroid Build Coastguard Worker        print(
118*cc02d7e2SAndroid Build Coastguard Worker            "recv from server(%d), message=%s"
119*cc02d7e2SAndroid Build Coastguard Worker            % (response.server_id, response.response_data)
120*cc02d7e2SAndroid Build Coastguard Worker        )
121*cc02d7e2SAndroid Build Coastguard Worker
122*cc02d7e2SAndroid Build Coastguard Worker    print("--------------Call BidirectionalStreamingMethod Over---------------")
123*cc02d7e2SAndroid Build Coastguard Worker
124*cc02d7e2SAndroid Build Coastguard Worker
125*cc02d7e2SAndroid Build Coastguard Workerdef main():
126*cc02d7e2SAndroid Build Coastguard Worker    with grpc.insecure_channel(SERVER_ADDRESS) as channel:
127*cc02d7e2SAndroid Build Coastguard Worker        stub = demo_pb2_grpc.GRPCDemoStub(channel)
128*cc02d7e2SAndroid Build Coastguard Worker
129*cc02d7e2SAndroid Build Coastguard Worker        simple_method(stub)
130*cc02d7e2SAndroid Build Coastguard Worker
131*cc02d7e2SAndroid Build Coastguard Worker        client_streaming_method(stub)
132*cc02d7e2SAndroid Build Coastguard Worker
133*cc02d7e2SAndroid Build Coastguard Worker        server_streaming_method(stub)
134*cc02d7e2SAndroid Build Coastguard Worker
135*cc02d7e2SAndroid Build Coastguard Worker        bidirectional_streaming_method(stub)
136*cc02d7e2SAndroid Build Coastguard Worker
137*cc02d7e2SAndroid Build Coastguard Worker
138*cc02d7e2SAndroid Build Coastguard Workerif __name__ == "__main__":
139*cc02d7e2SAndroid Build Coastguard Worker    main()
140