【问题标题】:Encountered "No route to host" error when trying to communicated to a webservice尝试与 Web 服务通信时遇到“No route to host”错误
【发布时间】:2011-10-20 07:18:25
【问题描述】:

我正在尝试与笔记本电脑上的网络服务通信,并使用 Android 手机作为客户端。我试图做一个简单的登录功能,但是,每当客户端尝试与 web 服务通信时,Eclipse 上的 DDMS 中都会弹出此错误。我可以使用家庭网络访问网络服务,但在学校时无法访问。如果您可能会问这个问题,我的 sch 中的 IP 地址是 172.22.XX.XX。虽然我知道这是一个私有 IP 地址,但即使我的 Android 手机连接到同一个网络,它仍然无法与我笔记本电脑上运行的 web 服务通信。谁能告诉我如何解决这个问题

10-20 15:00:42.875:错误/AndroidRuntime(6728):fillInStackTrace():java.net.SocketException:没有到主机的路由

这是完成这项工作的函数:

public String[] getPassword(String loginID){

    String[] temp = null;
    SoapObject request = new SoapObject(NAMESPACE, "GetPassword");

    PropertyInfo quotesProperty = new PropertyInfo();
    quotesProperty.setName("LoginID");
    quotesProperty.setValue(loginID);
    quotesProperty.setType(String.class);
    request.addProperty(quotesProperty);

    envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);

    String result = "";
    HttpTransportSE httpRequest = new HttpTransportSE(URL);
    httpRequest.debug = true;

    try
    {
        httpRequest.call(SOAP_ACTION, envelope);
        Log.e("Request",httpRequest.requestDump.toString());

        SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
        Log.e("Response",httpRequest.responseDump.toString());

        result =  response.toString();
        if(result != null){
            temp = result.split(";");
            passwordSecurity crypto = new passwordSecurity();
            temp[0]= crypto.cryptography(temp[0], false); //decrypt the password
        }

    }
    catch(Exception e)
    {
        e.printStackTrace();
        Log.e("AndroidRuntime", "getMessage(): "+e.getMessage());
        Log.e("AndroidRuntime", "getLocalizedMessage(): "+e.getLocalizedMessage());
        Log.e("AndroidRuntime", "fillInStackTrace(): "+e.fillInStackTrace().toString());

    }
    return temp;
}

来自 DDMS 的警告

10-20 16:56:32.180: WARN/System.err(13034): java.net.SocketException: No route to host
10-20 16:56:32.180: WARN/System.err(13034):     at    org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
10-20 16:56:32.180: WARN/System.err(13034):     at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:357)
10-20 16:56:32.180: WARN/System.err(13034):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204)
10-20 16:56:32.180: WARN/System.err(13034):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:437)
10-20 16:56:32.180: WARN/System.err(13034):     at java.net.Socket.connect(Socket.java:1002)
10-20 16:56:32.180: WARN/System.err(13034):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:75)
10-20 16:56:32.180: WARN/System.err(13034):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
10-20 16:56:32.180: WARN/System.err(13034):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:322)
10-20 16:56:32.180: WARN/System.err(13034):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
10-20 16:56:32.180: WARN/System.err(13034):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:285)
10-20 16:56:32.180: WARN/System.err(13034):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:267)
10-20 16:56:32.180: WARN/System.err(13034):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205)
10-20 16:56:32.180: WARN/System.err(13034):     at org.ksoap2.transport.ServiceConnectionSE.connect(ServiceConnectionSE.java:76)
10-20 16:56:32.180: WARN/System.err(13034):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:146)
10-20 16:56:32.180: WARN/System.err(13034):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)
10-20 16:56:32.180: WARN/System.err(13034):     at android.wps.server.operations.WifiPositioningServices.getPassword(WifiPositioningServices.java:43)
10-20 16:56:32.180: WARN/System.err(13034):     at android.wps.MainActivity$1.onClick(MainActivity.java:67)
10-20 16:56:32.180: WARN/System.err(13034):     at android.view.View.performClick(View.java:2538)
10-20 16:56:32.180: WARN/System.err(13034):     at android.view.View$PerformClick.run(View.java:9152)
10-20 16:56:32.180: WARN/System.err(13034):     at android.os.Handler.handleCallback(Handler.java:587)
10-20 16:56:32.180: WARN/System.err(13034):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-20 16:56:32.180: WARN/System.err(13034):     at android.os.Looper.loop(Looper.java:123)
10-20 16:56:32.180: WARN/System.err(13034):     at android.app.ActivityThread.main(ActivityThread.java:3691)
10-20 16:56:32.180: WARN/System.err(13034):     at java.lang.reflect.Method.invokeNative(Native Method)
10-20 16:56:32.180: WARN/System.err(13034):     at java.lang.reflect.Method.invoke(Method.java:507)
10-20 16:56:32.180: WARN/System.err(13034):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
10-20 16:56:32.180: WARN/System.err(13034):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
10-20 16:56:32.180: WARN/System.err(13034):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: java android sockets


    【解决方案1】:

    From inside the Android emulator,主机(您的笔记本电脑)是10.0.2.2——无论主机的实际 IP 地址是什么,这应该始终有效。

    【讨论】:

    • 是的..如果我尝试在模拟器上运行,它可以工作。但是现在当我尝试在我的 Android 手机上运行该程序并通过无线网络与我的笔记本电脑通信时,它无法运行,并且遇到了这个错误。
    • 您要么必须在部署到模拟器/设备之前手动更改 IP 地址,要么添加 a check to do this automatically
    • 嗯...我总是在每次运行程序之前更改IP地址,其中变量URL是一个字符串变量,“172.22.XX.XX:8080”。当我在家里运行我的程序时,只有 IP 地址会改变。
    • 哦,我刚刚重新阅读了您的问题。也许您的学校阻止了 8080 端口上的流量——您可以在学校网络上通过手机访问笔记本电脑上运行的 8080 端口上的网络应用程序吗?
    • 如果模拟器能够在我的 sch 中正常运行,是否意味着端口没有阻塞?
    【解决方案2】:

    我在这里遇到了同样的问题,使用的是平板电脑 (motorola xoom 3.2) 设备。

    平板电脑是 192.168.1.2 电脑 192.162.1.3

    当我将 url 设置为 192.162.1.3 我得到了这个堆栈跟踪

    12-10 22:18:22.050: WARN/System.err(6274): java.net.SocketException: No route to host
    12-10 22:18:22.050: WARN/System.err(6274): at     org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
    12-10 22:18:22.050: WARN/System.err(6274): at dalvik.system.****BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:369)****
    

    当我尝试一个不存在的 ip 时,我仍然没有到主机的路由,但在堆栈跟踪中没有这个 blockguard。 Loopback 或浏览器也可以正常工作。

    https://groups.google.com/group/android-developers/browse_thread/thread/7d96e7297da43cec

    我猜是同样的问题,但没有任何线索

    伏都教解决方案: 重新启动平板电脑并遇到同样的问题后,我所做的是禁用设备上的 USB 调试,断开 wlan(飞行模式),重新连接,重新启动 USB 调试,由于某种原因,这似乎解决了问题

    【讨论】:

      【解决方案3】:

      由于身份验证问题,我在从另一台 PC 连接到我的 (ASP.NET) Web 服务时遇到问题。身份验证问题解决后,我的 Android 应用程序仍然收到“无路由到主机”错误。关闭并重新打开设备上的 WiFi 为我解决了这个问题。

      【讨论】:

        【解决方案4】:

        在我的例子中,我的代码在我的网络服务中看起来像这样:

        public static Song GetSong()
        {
          Song song = null;
          // Some database operations
          // Then initialized the object with some data
          if(someValueReturnedFromDb)
          {
            song = new Song();
            song.Source = "Path"; // etc
          }
          return song;
        }
        

        之后我只是将代码更改为:

        public static Song GetSong()
        {
          Song song = new Song();
          // Some database operations
          // Then initialized the object with some data
          if(someValueReturnedFromDb)
          {
            song.Source = "Path"; // etc
          }
          return song;
        }
        

        【讨论】:

          猜你喜欢
          • 2020-03-23
          • 1970-01-01
          • 2013-08-21
          • 2019-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-20
          相关资源
          最近更新 更多