我正在使用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)
**更新:**当我用模拟器运行应用程序时,它正在工作。所以这是只在使用真实的设备时发生的错误。
4条答案
按热度按时间qhhrdooz1#
如果您在同一台计算机上运行AVD(客户端)和后端,您必须将基本URL从“localhost/127.0.0.1“设置为“10.0.2.2“。
下面是Github中的答案。
qf9go6mv2#
在我的例子中,这是一个防火墙问题,在服务器上运行
systemctl stop firewalld
解决了这个问题。ekqde3dh3#
我遇到了同样的错误,Flutter应用程序作为grpc客户端,C#作为grpc服务器。问题出在服务器上,我使用“localhost”作为主机参数,改为“0.0.0.0“,现在运行良好。
vjhs03f74#
也许你应该添加网络权限到android项目:
AndroidManifest.xml: