2010-01-19 22 views
5

tôi làm một:InetAddress.getByName trên 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; 
} 

trong ứng dụng Android của tôi, nhưng nó không bao giờ resoling tên máy, nó luôn luôn ném một ngoại lệ, không có vấn đề gì tên tôi sử dụng.


Nhưng sử dụng internet trên công trình giả lập tương tự, và tôi đã thêm

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

để AndoidManifest.xml

và đây là lớp máy chủ cho những người giả sử tôi có none

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

Tôi giả sử bạn có một lớp Server.java? Tôi biết rằng UnknwnHostException bị ném khi tra cứu địa chỉ không thành công. –

+0

có, đã thêm ở trên. –

+0

mã này sẽ truy vấn các máy chủ động đất, whats mong muốn của bạn đầu ra? –

Trả lời

4

Tôi đã tìm thấy câu trả lời. Đối với bất cứ lý do nào, bạn phải sử dụng:

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

1

Đó là lạ mà bạn phải làm như vậy. java.net.InetAddress.getByName hoạt động đối với tôi, ngoài hộp.

Có một số vấn đề (liên tục) liên quan đến độ phân giải DNS trong trình giả lập Android, do đó có thể là do nó.

0

Không biết nếu đó là một lỗi đánh máy, nhưng bạn nói bạn có:

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

Nhưng nó phải là:

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

tôi đã cố gắng getByName và nó hoạt động tốt.

Bạn có thể sửa các quyền của mình và chuyển từ getByName thành getAllByName cùng một lúc không? Chỉ cần tò mò, nếu bạn có thể xác nhận rằng getByName vẫn không hoạt động cho bạn?

1

Tôi đã gặp sự cố tương tự và tôi phát hiện ra rằng trong một số phiên bản Android (từ tổ ong) không được phép theo mặc định để thực hiện thao tác mạng từ chuỗi chính. Vì vậy, bạn có thể giải quyết nó theo 2 cách. Thực hiện thao tác trong các luồng khác nhau hoặc cho phép thực hiện thao tác mạng trong chuỗi chính. Để làm điều đó, hãy sử dụng một cái gì đó như thế này:

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

trong khi điều này là đúng, thực tế rất xấu để tạo kết nối trên chuỗi giao diện người dùng vì nó chặn luồng. – momo

+0

cảm ơn bạn. tôi cần giải pháp này ... –

+0

Mặc dù giải pháp này có hiệu quả nhưng không được khuyến nghị và thực hành không tốt. Sử dụng AsyncTasks để thực hiện các hoạt động mạng trong chuỗi khác nhau. – darshanz