在我的笔记本电脑上,我有一个 gRPC 服务器在 .NET 6 应用程序中运行,使用 Grpc.AspNetCore 2.40.0。在我的手机上,我有一个使用 Uno UI 框架构建的 .NET 6 Android 应用程序,使用 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")}
如果我不使用此设置,而是以这些配置中的任何一种运行应用程序:
adb reverse tcp:8080 tcp:7773
通过 USB 与 PC 对话然后连接成功,所以我知道问题是特定于尝试通过网络连接。
我可以从我的安卓手机上ping我电脑的本地网络IP。 gRPC 未使用 https,客户端正在尝试连接到
http://192.168.0.246:7773
。这是正确的地址吗?我也尝试过只使用 192.168.0.246:7771
但这导致 gRPC 客户端首先无法创建。
我尝试过使用Windows防火墙打开相关的入站连接端口,但我对此了解不多。防火墙有什么需要做的吗? gRPC 服务器在端口 7773 上运行。
是否需要做任何其他事情来允许 gRPC 客户端通过本地网络连接?
谢谢!
想通了。我的服务器正在监听
localhost
,这意味着它只监听来自同一设备的连接。要监听任何连接,我必须将其更新为监听 0.0.0.0.
对于我正在使用的 ASP.NET Web 服务器,这是通过更新对
ConfigureKestrel
的调用以使用 ListenAnyIP
选项而不是 ListenLocalhost
选项来完成的。
为了帮助调试,我使用了 Wireshark 和
netstat -ab
.
我是 gRPC 的新手,我也在尝试通过 Asp.Net 核心 gRPC 服务项目连接在 Windows 机器上运行的 gRPC 服务器和在带有 .NET MAUI 应用程序的 Android 上运行的 gRPC 客户端。我也遇到了与“连接到子通道时出错”相同的异常。 您能否提供一些有关如何修复它的见解。