dart FluttergRPC错误-操作系统错误:连接被拒绝

yhxst69z  于 2022-12-20  发布在  Flutter
关注(0)|答案(4)|浏览(235)

我正在使用protobuf和gRPC在Flutter应用程序和python服务器(Flutter中的客户端和python中的服务器)之间交换信息。服务器运行在www.example.com上0.0.0.0,客户端使用服务器计算机的IP地址。

import 'dart:async';
import 'User.pbgrpc.dart';
import 'User.pb.dart';
import 'package:grpc/grpc.dart';

Future<Null> main() async {
  final channel = new ClientChannel('IP_ADDRESS',
      port: 50051,
      options: const ChannelOptions(
          credentials: const ChannelCredentials.insecure()));
  final stub = new StorageClient(channel);

  Test input = new Test();
  input.id = 1;
  try {
    var response = await stub.getPerson(input);
    print('Greeter client received: ${response}');
  } catch (e) {
    print('Caught error: $e');
  }
  await channel.shutdown();
}

如果我使用dart client.dart运行这个客户端,一切正常,得到了预期的响应。但是如果我把这个方法嵌入到flutter应用中,比如:

@override
Widget build(BuildContext context) {

Future<Null> testRPC() async {
  final channel = new ClientChannel('IP_ADDRESS',
      port: 50051,
      options: const ChannelOptions(
          credentials: const ChannelCredentials.insecure()));
  final stub = new StorageClient(channel);

  Test input = new Test();
  input.id = 1;
  try {
    var response = await stub.getPerson(input);
    print('Greeter client received: ${response}');
  } catch (e) {
    print('Caught error: $e');
  }
  await channel.shutdown();
}

testRPC();
...etc
}

我得到:

I/flutter (18824): Caught error: gRPC Error (14, Error connecting: SocketException: OS Error: No route to host, errno = 111, address = localhost, port = 45638)

**更新:**当我用模拟器运行应用程序时,它正在工作。所以这是只在使用真实的设备时发生的错误。

qhhrdooz

qhhrdooz1#

如果您在同一台计算机上运行AVD(客户端)和后端,您必须将基本URL从“localhost/127.0.0.1“设置为“10.0.2.2“。
下面是Github中的答案。

qf9go6mv

qf9go6mv2#

在我的例子中,这是一个防火墙问题,在服务器上运行systemctl stop firewalld解决了这个问题。

ekqde3dh

ekqde3dh3#

我遇到了同样的错误,Flutter应用程序作为grpc客户端,C#作为grpc服务器。问题出在服务器上,我使用“localhost”作为主机参数,改为“0.0.0.0“,现在运行良好。

vjhs03f7

vjhs03f74#

也许你应该添加网络权限到android项目:
AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.client">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
   <application
        android:label="client"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">

相关问题