如何从客户端Android应用调用本地网络PC上运行的gRPC服务器?

h5qlskok  于 2023-02-10  发布在  Android
关注(0)|答案(1)|浏览(185)

在我的笔记本电脑上,我有一个gRPC服务器在一个.NET 6应用程序中运行,使用Grpc.AspNetCore 2.40.0。在我的手机上,我有一个.NET 6 Android应用程序,使用Uno UI框架构建,使用gRPC客户端GRPC.Net.Client 2.46.0。两者都在同一个本地网络上。
我希望能够从手机应用程序连接到gRPC服务器。
当我尝试在应用程序中连接时,它失败并显示错误:

{ManagedException, High : Status(StatusCode="Unavailable", Detail="Error connecting to subchannel.", DebugException="System.Net.Sockets.SocketException (110): Connection timed out
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
   at System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|277_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken)
   at Grpc.Net.Client.Balancer.Internal.SocketConnectivitySubchannelTransport.TryConnectAsync(CancellationToken cancellationToken) in /_/src/Grpc.Net.Client/Balancer/Internal/SocketConnectivitySubchannelTransport.cs:line 138")}

如果我在以下任何配置中运行应用,而不是使用此设置:

  • 在同一台PC上运行的Windows应用程序
  • Android应用程序在同一台PC的模拟器上运行
  • 在通过USB连接到PC的手机上运行的Android应用程序,使用adb reverse tcp:8080 tcp:7773通过USB与PC通信

然后连接成功,所以我知道问题是尝试通过网络连接所特有的。
我可以从我的Android手机ping我的PC的本地网络IP。gRPC没有使用https,客户端正在尝试连接到http://192.168.0.246:7773。这是正确的地址吗?我也尝试只使用192.168.0.246:7771,但这导致gRPC客户端无法创建摆在首位。
我试过使用Windows防火墙打开相关的入站连接端口,但我对此了解不多。是否需要对防火墙做些什么?gRPC服务器正在端口7773上运行。
要允许gRPC客户机通过本地网络进行连接,还需要做什么吗?
谢谢!

iaqfqrcu

iaqfqrcu1#

找到了。我的服务器监听localhost,这意味着它只监听来自同一设备的连接。要监听任何连接,我必须更新它监听0.0.0.0。
对于我正在使用的ASP.NETWeb服务器,这是通过将对ConfigureKestrel的调用更新为使用ListenAnyIP选项而不是ListenLocalhost选项来完成的。
为了帮助调试,我使用了Wireshark和netstat -ab

相关问题