为什么服务器的数据没有传到真实设备上的应用程序?

Why doesn't the data from the server come to the app on the real device?

应用程序启动时,会向服务器(位于我的计算机本地)发送请求以获取 post 的列表。理论上,服务器应该处理请求和 return 这个 post 列表。但它没有 return 任何东西。在 LogCat 中没有错误,但在调试时,抛出异常而不是服务器响应:

((SocketTimeoutException)e).detailMessage = failed to connect to /192.168.1.35 (port 9999) from /192.168.1.33 (port 49742) after 30000ms

当我尝试添加新的 post(通过 Post 方法向服务器添加 post)时,我在 LogCat 处遇到错误。这是错误的文本:

2021-11-02 21:17:29.025 12197-12210/com.example E/SpellCheckerSession: ignoring processOrEnqueueTask due to unexpected mState=TASK_CLOSE scp.mWhat=TASK_CLOSE
2021-11-02 21:17:39.811 12197-12568/com.example E/AndroidRuntime: FATAL EXCEPTION: Thread-4
    Process: com.example, PID: 12197
    java.net.SocketTimeoutException: failed to connect to /192.168.1.35 (port 9999) from /192.168.1.33 (port 49918) after 30000ms
        at libcore.io.IoBridge.connectErrno(IoBridge.java:185)
        at libcore.io.IoBridge.connect(IoBridge.java:130)
        at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:129)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:356)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:357)
        at java.net.Socket.connect(Socket.java:616)
        at okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.kt:63)
        at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:295)
        at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:207)
        at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226)
        at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
        at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
        at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
        at okhttp3.internal.connection.RealCall.execute(RealCall.kt:154)
        at com.example.repository.PostRepositoryImpl.save(PostRepositoryImpl.kt:60)
        at com.example.viewmodel.PostViewModel$save.invoke(PostViewModel.kt:54)
        at com.example.viewmodel.PostViewModel$save.invoke(PostViewModel.kt:53)
        at kotlin.concurrent.ThreadsKt$thread$thread.run(Thread.kt:30)

IP 地址和端口正确。在本机 android-studio 模拟器上,我输入地址 10.0.2.2:9999 - post 即将到来。我使用 Genymotion 模拟器(它有自己的 IP)并输入 192.168.1.35:9999 - 来自服务器的答案也来了。只有真实设备(小米红米 5 和 Nexus 5X)没有响应。请帮忙解决问题![​​=12=]

UPD:谢谢大家的帮助,伙计们!我什么都试过了,但问题确实是打开防火墙引起的)

服务器 pc 上的防火墙可以阻止传入连接。关掉它进行测试。

服务器只能绑定到localhost。不要绑定你的服务器,如果你必须将它绑定到 0.0.0.0.

这里的重点是这一行:

java.net.SocketTimeoutException: failed to connect to /192.168.1.35 (port 9999) from /192.168.1.33 (port 49918) after 30000ms

它告诉我们它“连接失败”,它告诉我们这是一个“SocketTimeoutException”并且在 30 秒后没有收到任何响应。

这只是 TCP 连接请求,因此很可能是客户端和服务器之间某处的网络问题。

因为这不是找不到路由错误,所以首先要检查的是是否有防火墙。