java.net.SocketException:android 模拟器中的协议不支持地址族

Posted

技术标签:

【中文标题】java.net.SocketException:android 模拟器中的协议不支持地址族【英文标题】:java.net.SocketException: Address family not supported by protocol in android emulator 【发布时间】:2012-02-07 18:50:35 【问题描述】:

我正在尝试运行简单的应用程序以从 android 模拟器访问互联网,这是我的代码。我通过"...Wireless Networks -> APN -> ..." 在模拟器中代理和配置代理设置。但是互联网是通过浏览器而不是应用程序工作的。

            HttpURLConnection connection = null;
    String URLName = "http://www.google.com";

    try 
        URL u = new URL(URLName);
        connection = (HttpURLConnection) u.openConnection();
        connection.setRequestMethod("HEAD");
        int code = connection.getResponseCode();
        Log.d(TAG1, " " + code);
        // You can determine on HTTP return code received. 200 is success.
     catch (MalformedURLException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
        Log.d(TAG1, e.toString());
    

    finally 
        if (connection != null) 
            connection.disconnect();
        
    

Logcat中错误日志部分如下:

01-11 01:01:26.308: DEBUG/SntpClient(72): request time failed: java.net.SocketException: Address family not supported by protocol

01-11 01:02:39.909: WARN/System.err(422): java.net.SocketException: The operation timed out

我在论坛中搜索后尝试了以下选项,但它们似乎都不起作用:

    在 android 启动选项中我使用了 -http-proxy server:port -dns-server server

    我已在清单文件中包含互联网权限

    使用权限 android:name="android.permission.INTERNET"

    uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" 
    

    在有人建议后设置系统属性以使用 ipv4 堆栈

            java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
    java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");
    

我正在开发 Android 2.2 和 windows vista,你能帮帮我吗...

【问题讨论】:

浏览器在模拟器中能正常工作吗? @LalitPoptani 是的浏览器在模拟器中运行良好 【参考方案1】:

试着去做.....

connection.setConnectTimeout(timeoutInMillisecs);

可能你没有设置它。

【讨论】:

好了,试试用----------HttpConnectionParams.setConnectionTimeout(client.getParams(), CONNECTION_TIMEOUT); HttpConnectionParams.setSoTimeout(client.getParams(), SOCKET_TIMEOUT);【参考方案2】:

尝试将其添加到您的 AndroidManifest.xml 中:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

你还需要捕获这个异常:

 catch(SocketException ex)
       
         Log.e("Error : " , "Error on soapPrimitiveData() " + ex.getMessage());
           ex.printStackTrace();
       

【讨论】:

在尝试了这个之后,它适用于本地地址(代理后面)。外部地址仍然不起作用.. 盗自***.com/questions/7854300/…【参考方案3】:

尝试像这样在 Oncreate() 中以编程方式设置代理和端口

      System.setProperty("http.proxyHost","IPaddress of ur machine");
      System.setProperty("http.proxyPort","port no");

【讨论】:

【参考方案4】:

请试试这个:

HttpURLConnection con =null;

URL url = new URL("abcdefg");

Proxy proxy=new Proxy(java.net.Proxy.Type.HTTP, new InetSocketAddress(android.net.Proxy.getDefaultHost(),android.net.Proxy.getDefaultPort()));

con = (HttpURLConnection) url.openConnection(proxy);

【讨论】:

以上是关于java.net.SocketException:android 模拟器中的协议不支持地址族的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致我的 java.net.SocketException:连接重置? [复制]

如何修复 java.net.SocketException:损坏的管道?

Java 1.6 HttpsURLConnection:java.net.SocketException:连接重置

java.net.SocketException:recvfrom 失败:ETIMEDOUT(连接超时)

java.net.SocketException:软件导致连接中止:recv 失败 [重复]

如何解决 java.net.SocketException:使用 selenium 的 java 中的连接重置异常?