【发布时间】:2017-04-11 08:20:56
【问题描述】:
Android 6.0 上的改造在连接到接入点后进行 Http 调用时出现问题
重现步骤:
- 连接到 Esp8266 接入点
- 向http://192.168.4.1(esp8266 接入点的默认网关)发起 http 调用 WIFI的IP地址是192.168.4.2
- 它抛出以下异常
我在 Android 5.1 上尝试过同样的方法,同样的代码可以完美运行
java.net.SocketException:套接字失败:ENONET(机器不在网络上)
在 libcore.io.IoBridge.socket(IoBridge.java:619)
在 java.net.PlainSocketImpl.create(PlainSocketImpl.java:198)
在 java.net.Socket.checkOpenAndCreate(Socket.java:689)
在 java.net.Socket.setSoTimeout(Socket.java:543)
在 okhttp3.internal.io.RealConnection.connectSocket(RealConnection.java:183) 在 okhttp3.internal.io.RealConnection.buildConnection(RealConnection.java:170) 在 okhttp3.internal.io.RealConnection.connect(RealConnection.java:111) 在 okhttp3.internal.http.StreamAllocation.findConnection(StreamAllocation.java:187) 在 好的http3.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:123) 在 okhttp3.internal.http.StreamAllocation.newStream(StreamAllocation.java:93) 在 okhttp3.internal.http.HttpEngine.connect(HttpEngine.java:296)
在 okhttp3.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
在 okhttp3.RealCall.getResponse(RealCall.java:243)
在 okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:201) 在 okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163) 在 okhttp3.RealCall.access$100(RealCall.java:30)
在 okhttp3.RealCall$AsyncCall.execute(RealCall.java:127)
在 okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 在 java.lang.Thread.run(Thread.java:818)
引起:android.system.ErrnoException:套接字失败:ENONET (机器不在网络上)
在 libcore.io.Posix.socket(本机方法)
在 libcore.io.BlockGuardOs.socket(BlockGuardOs.java:282)
在 libcore.io.IoBridge.socket(IoBridge.java:604)
在 java.net.PlainSocketImpl.create(PlainSocketImpl.java:198)
在 java.net.Socket.checkOpenAndCreate(Socket.java:689)
在 java.net.Socket.setSoTimeout(Socket.java:543) 在 okhttp3.internal.io.RealConnection.connectSocket(RealConnection.java:183) 在 okhttp3.internal.io.RealConnection.buildConnection(RealConnection.java:170) 在 okhttp3.internal.io.RealConnection.connect(RealConnection.java:111)
在 okhttp3.internal.http.StreamAllocation.findConnection(StreamAllocation.java:187) 在 好的http3.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:123) 在 okhttp3.internal.http.StreamAllocation.newStream(StreamAllocation.java:93) 在 okhttp3.internal.http.HttpEngine.connect(HttpEngine.java:296)
在 okhttp3.internal.http.HttpEngine.sendRequest(HttpEngine.java:248) 在 okhttp3.RealCall.getResponse(RealCall.java:243) 在 okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:201) 在 okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
在 okhttp3.RealCall.access$100(RealCall.java:30)
在 okhttp3.RealCall$AsyncCall.execute(RealCall.java:127)
在 okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588 在 java.lang.Thread.run(Thread.java:818)
【问题讨论】:
-
ENONET (Machine is not on the network)可能有几个原因。最可能的一种是您尝试过早地进行套接字连接,即您没有等待 android 智能手机完全连接到网络。请在 HTTP 请求之前打印出您自己的 IP 地址以确保这一点。另一件事可能是 ESP 创建的网络(如网络掩码或网络网关)上的错误 DHCP 设置。可以用普通电脑连接网络吗?它绘制什么IP?你能ping通网关吗? -
它绘制IP 192.168.4.2。它仍然仅在 android 6.0.1 上引发相同的异常。在 android 5.1 上它工作正常。
-
我添加了 5 秒的延迟,然后获取了 dns 信息并尝试连接。 Ip 地址 192.168.4.2 网络掩码 255.255.255.0 网关 192.168.4.1 dns1 192.168.4.1 dns2 0.0.0.0
-
我可以 ping 网关。并且chrome可以访问192.168.4.1
-
这与改造无关,但 Volley 也会发生。
标签: android retrofit retrofit2 esp8266 okhttp