为什么服务器的数据没有传到真实设备上的应用程序?
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 连接请求,因此很可能是客户端和服务器之间某处的网络问题。
因为这不是找不到路由错误,所以首先要检查的是是否有防火墙。
应用程序启动时,会向服务器(位于我的计算机本地)发送请求以获取 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 连接请求,因此很可能是客户端和服务器之间某处的网络问题。
因为这不是找不到路由错误,所以首先要检查的是是否有防火墙。