python-3.x 使用gRPC连接两台计算机

jbose2ul  于 2022-12-20  发布在  Python
关注(0)|答案(2)|浏览(379)

我有一个gRPC项目,在同一台机器上运行服务器和客户端时工作正常,但当我尝试在使用IPV4的同一WiFi网络中使用不同的机器时,客户端上发生以下错误:

Traceback (most recent call last):
  File "client.py", line 29, in <module>
    run()
  File "client.py", line 25, in run
    add_reply = stub.Add(add_request)
  File "/home/caio/dev/laboratorio/mygrpc/.env/lib/python3.8/site-packages/grpc/_channel.py", line 946, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/home/caio/dev/laboratorio/mygrpc/.env/lib/python3.8/site-packages/grpc/_channel.py", line 849, in _end_unary_response_blocking
    raise _InactiveRpcError(state)
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
        status = StatusCode.UNAVAILABLE
        details = "failed to connect to all addresses; last error: UNKNOWN: ipv4:192.168.100.9:50051: tcp handshaker shutdown"
        debug_error_string = "UNKNOWN:failed to connect to all addresses; last error: UNKNOWN: ipv4:192.168.100.9:50051: tcp handshaker shutdown {grpc_status:14, created_time:"2022-12-10T15:21:32.619696358-03:00"}"
>

我似乎有人报告说,它为他们工作,但它似乎没有太大的不同,所以我不知道什么是失踪.服务器代码:

from os import system
system('clear')

from concurrent import futures
import time
import grpc
from grpc import _server
import sum_pb2
import sum_pb2_grpc

PORT = 50051
HOST = "localhost"

class Servicer(sum_pb2_grpc.SumNumbersServicer):
    def Add(self, request, context):
        print(request)

        add_reply = sum_pb2.AddReply()
        add_reply.r = request.a + request.b
        
        # return super().Add(request, context)
        return add_reply

def serve():
    server:_server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    sum_pb2_grpc.add_SumNumbersServicer_to_server(Servicer(), server)
    # serve._add_insecure_port(f"localhost:{PORT}")
    server.add_insecure_port(f"{HOST}:{PORT}")
    server.start()
    print(f"Listenning on port {PORT}")
    try:
        server.wait_for_termination()
    except KeyboardInterrupt:
        server.stop(0)

if __name__ == "__main__":
    serve()

客户代码:

from os import system
system('clear')

from concurrent import futures
import time
from random import randint
import grpc
from grpc import _server
import sum_pb2
import sum_pb2_grpc

PORT = 50051
HOST = "localhost"
HOST = "192.168.100.9"
min = 0
max = 100

def run():
    with grpc.insecure_channel(f"{HOST}:{PORT}") as channel:
        stub = sum_pb2_grpc.SumNumbersStub(channel)
        a = randint(min, max)
        b = randint(min, max)

        add_request = sum_pb2.AddRequest(a= a, b= b)
        add_reply = stub.Add(add_request)
        print(f"{a} + {b} = {add_reply}")

if __name__ == "__main__":
    run()

编辑:当使用“0.0.0.0“作为 server.py 中的主机时,它会打印以下错误(与上次不同,这次我在两台机器上都使用以太网电缆,如果有区别,请idk):

Traceback (most recent call last):
  File "client.py", line 29, in <module>
    run()
  File "client.py", line 25, in run
    add_reply = stub.Add(add_request)
  File "/home/estagiarioti/dev/laboratorio/mygrpc/.env/lib/python3.8/site-packages/grpc/_channel.py", line 946, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/home/estagiarioti/dev/laboratorio/mygrpc/.env/lib/python3.8/site-packages/grpc/_channel.py", line 849, in _end_unary_response_blocking
    raise _InactiveRpcError(state)
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
        status = StatusCode.UNAVAILABLE
        details = "failed to connect to all addresses; last error: UNKNOWN: ipv4:192.168.10.6:50051: Failed to connect to remote host: No route to host"
        debug_error_string = "UNKNOWN:failed to connect to all addresses; last error: UNKNOWN: ipv4:192.168.10.6:50051: Failed to connect to remote host: No route to host {grpc_status:14, created_time:"2022-12-12T13:58:15.049856347-03:00"}"
>

在WiFi网络和主机中的“www.example.com“IP中运行两台机器时出现错误消息0.0.0.0:

Traceback (most recent call last):
  File "client.py", line 29, in <module>
    run()
  File "client.py", line 25, in run
    add_reply = stub.Add(add_request)
  File "/home/caio/dev/laboratorio/mygrpc/.env/lib/python3.8/site-packages/grpc/_channel.py", line 946, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/home/caio/dev/laboratorio/mygrpc/.env/lib/python3.8/site-packages/grpc/_channel.py", line 849, in _end_unary_response_blocking
    raise _InactiveRpcError(state)
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
        status = StatusCode.UNAVAILABLE
        details = "failed to connect to all addresses; last error: UNKNOWN: ipv4:192.168.100.9:50051: tcp handshaker shutdown"
        debug_error_string = "UNKNOWN:failed to connect to all addresses; last error: UNKNOWN: ipv4:192.168.100.9:50051: tcp handshaker shutdown {created_time:"2022-12-12T19:12:13.762636131-03:00", grpc_status:14}"
>

ps:有时候我用WSL,有时候我不用,也许这一点很重要。

zpqajqem

zpqajqem1#

localhost通常解析为127.0.0.1,这是一个特殊的所谓的环回网络地址。当您知道您不需要外部(到主机)连接时使用它,因为它通常不使用主机的网络堆栈。
通常你会希望把服务器绑定到0.0.0.0,这样就把服务器绑定到了所有主机的网络接口上,这是一种简单的方法来确保你的服务对外部主机可用。
此外,您还需要确保服务器主机的网络地址为192.168.100.9,以确保客户机尝试与正确的主机通信。

pqwbnv8z

pqwbnv8z2#

我不知道我在WSL中做错了什么,但当我使用纯Windows时,它工作正常,在防火墙设置中,我允许列表中的所有python访问公共和私有网络。

相关问题