【问题标题】:InetAddress.getByName on AndroidAndroid 上的 InetAddress.getByName
【发布时间】:2017-01-01 04:24:51
【问题描述】:

我做了一个:

java.net.InetAddress serverAddr;
try {
    serverAddr = java.net.InetAddress.getByName(Server.SERVERNAME);
}
catch (java.net.UnknownHostException exception) {
    //System.err.println ("wrong server name !!!");
    HelloWorldActivity.tv.setText("wrong server name !!!");
    return;
}

在我的 android 应用程序中,但它从不解析主机名,它总是抛出异常,无论我使用什么名称。


但是在同一个模拟器上使用互联网是可行的,我已经添加了

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

到 AndoidManifest.xml

这是为那些认为我没有的人准备的服务器类

public class Server
{
    public static String SERVERNAME = "monster.idsoftware.com";
    public static String SERVERIP = "209.85.129.99";
    public static int SERVERPORT = 27950;
    public static int PROTOCOL = 68;
}

【问题讨论】:

  • 我假设你有一个 Server.java 类?我知道地址查找失败时会抛出 UnknwnHostException。
  • 这段代码将查询地震服务器,你想要的输出是什么?
  • 通过解析主机名在 UDP 上查询 monster.idsoftware.com,通过端口 27950 上的 UDP 连接到该 IP,发送“ÿÿÿÿgetservers 68 'all'”,其中 68 是协议版本。接收 UTF-7 编码的主机列表,将其解码为 ip+端口列表,显示该列表。但我被困在问题 1 上。
  • 我最好的建议是尝试将其加载到外部 android 设备上并从那里测试,我不知道你是否可以在模拟器上使用 UDP
  • 这可能是代理或 nat 的问题。

标签: java android sockets


【解决方案1】:

我遇到了类似的问题,我发现在某些版本的android(来自honeycombs)中,默认情况下不允许从主线程执行网络操作。所以你可以通过两种方式解决它。在不同的线程中执行操作或允许在主线程中进行网络操作。为此,请使用以下内容:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitNetwork().build();
StrictMode.setThreadPolicy(policy);

【讨论】:

  • 虽然这是真的,但在 UI 线程上建立连接是一种非常糟糕的做法,因为它会阻塞线程。
  • 虽然此解决方案可行,但不建议这样做,而且是一种不好的做法。使用 AsyncTasks 在不同的线程中执行网络操作。
【解决方案2】:

我找到了答案。无论出于何种原因,您都必须使用:

java.net.InetAddress[] x= java.net.InetAddress.getAllByName(Server.SERVERNAME) ; HelloWorldActivity.tv.setText("Address: "+x[0].getHostAddress());

【讨论】:

    【解决方案3】:

    奇怪的是你必须这样做。 java.net.InetAddress.getByName 为我工作,开箱即用。

    Android 模拟器中存在一些与 DNS 解析相关的(持续的)问题,可能就是这样。

    【讨论】:

      【解决方案4】:

      不知道是不是笔误,但你说你有:

      <use-permission id="android.permission.INTERNET" />
      

      但它必须是:

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

      我尝试了 getByName,它工作正常。

      您是否修复了您的权限并同时从 getByName 切换到 getAllByName?只是好奇,您是否可以确认 getByName 仍然不适合您?

      【讨论】:

        猜你喜欢
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多