Java Android上的InetAddress.getByName

Java Android上的InetAddress.getByName,java,android,sockets,Java,Android,Sockets,我做了一件事: 在我的android应用程序中,它从不解析主机名,不管我使用什么名称,它总是抛出一个异常 但是在同一个模拟器上使用互联网是可行的,我补充说 java.net.InetAddress serverAddr; try { serverAddr = java.net.InetAddress.getByName(Server.SERVERNAME); } catch (java.net.UnknownHostException exception) { //System

我做了一件事:

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


但是在同一个模拟器上使用互联网是可行的,我补充说

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;
}

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

java.net.InetAddress[]x=java.net.InetAddress.getAllByName(Server.SERVERNAME);

HelloWorldActivity.tv.setText(“地址:+x[0].getHostAddress())

奇怪的是你不得不这么做
java.net.InetAddress.getByName
对我来说是现成的


Android emulator中存在一些与DNS解析相关的(正在发生的)问题,因此可能就是这些问题。

不知道这是否是一个打字错误,但您说您有:

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;
}

但它必须是:

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

我试过getByName,效果很好


您是否可以修复权限并同时从getByName切换到getAllByName?好奇的是,如果你能确认getByName仍然不适用于你?

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

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

我假设您有一个Server.java类?我知道地址查找失败时会抛出unknownhostexception。这段代码将查询quake服务器,您希望的输出是什么?通过解析主机名在UDP上查询monster.idsoftware.com,通过端口27950上的UDP连接到该IP,发送“getservers 68‘all’”,其中68是协议版本。接收经过UTF-7编码的主机列表,将其解码为ip+端口列表,并显示该列表。但是我被问题1困住了。我最好的建议是尝试将其加载到外部android设备上并从那里进行测试,我不知道您是否可以在模拟器上使用UDP。代理可能有问题,或者nat。虽然这是事实,但在UI线程上建立连接是一种非常糟糕的做法,因为它会阻塞线程。虽然此解决方案可以工作,但不推荐使用,而且是一种糟糕的做法。使用AsyncTasks在不同线程中执行网络操作。
<uses-permission android:name="android.permission.INTERNET" />
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitNetwork().build();
StrictMode.setThreadPolicy(policy);