在我的笔记本电脑上,我有一个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客户机通过本地网络进行连接,还需要做什么吗?
谢谢!
1条答案
按热度按时间iaqfqrcu1#
找到了。我的服务器监听
localhost
,这意味着它只监听来自同一设备的连接。要监听任何连接,我必须更新它监听0.0.0.0。对于我正在使用的ASP.NETWeb服务器,这是通过将对
ConfigureKestrel
的调用更新为使用ListenAnyIP
选项而不是ListenLocalhost
选项来完成的。为了帮助调试,我使用了Wireshark和
netstat -ab
。