在安卓系统中使用 InetAddress.getByName 方法

8

我做一个:

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

在我的安卓应用中,无论我使用什么名称,它都无法解析主机名,并且总是抛出异常。


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

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

到AndroidManifest.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异常。 - Anthony Forloney
这段代码将查询Quake服务器,您想要什么样的输出? - Anthony Forloney
通过解析主机名查询monster.idsoftware.com的UDP,连接到该IP地址的端口27950上的UDP,发送“ÿÿÿÿgetservers 68'all'”,其中68是协议版本。 接收一个UTF-7编码的主机列表,将其解码为IP+端口列表,并显示该列表。但我卡在了问题1上。 - Stefan Steiger
我最好的建议是尝试将其加载到外部Android设备上并从那里进行测试,我不知道您是否可以在模拟器上使用UDP。 - Anthony Forloney
可能是代理或NAT的问题。 - Stefan Steiger
我有同样的问题,“InetAddress.getAllByName”不起作用,但我可以使用“BufferedReader”等获取页面源代码。 - kolobok
5个回答

8

我曾遇到类似问题,后来发现在某些版本的安卓系统(从蜂巢版本开始),默认情况下不允许在主线程执行网络操作。因此,您可以通过以下两种方式解决它。一是在不同的线程中执行操作,二是允许在主线程中进行网络操作。要实现后者,可以使用类似以下代码:

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

1
虽然这是正确的,但在UI线程上建立连接是非常不好的做法,因为它会阻塞线程。 - momo
1
尽管这种解决方案可以工作,但不建议使用,是一种不好的做法。使用AsyncTasks在不同的线程中执行网络操作。 - darshanz

4
我找到了答案。不管什么原因,你必须使用:
java.net.InetAddress[] x = java.net.InetAddress.getAllByName(Server.SERVERNAME);
HelloWorldActivity.tv.setText("Address: "+x[0].getHostAddress());

1

很奇怪你需要这样做。对我来说,java.net.InetAddress.getByName可以直接使用。

Android模拟器中有一些(正在进行中的)与DNS解析相关的问题,可能是这个原因。


0

不知道是否打错字,但你说你有:

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

但它必须是:

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

我尝试了getByName,它运行良好。

也许你修复了权限并同时从getByName切换到getAllByName?只是好奇,如果你可以确认getByName对你仍然不起作用吗?


0

首先,尝试从默认浏览器(Google Chrome)解析本地PC的DNS名称。如果无法解析,则可能是路由器设置或能力问题...


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接