2010-01-19 9 views
5

robię:InetAddress.getByName na Androida

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

w moim android aplikacji, ale to nigdy nie zelowania nazwę hosta, to zawsze zgłasza wyjątek, bez względu na nazwę używam.


Jednak korzystanie z internetu na tych samych prac emulatora i Dodałem

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

do AndoidManifest.xml

i tu jest klasa serwer dla tych, którzy zakładają mam żadnego

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

Zakładam, że masz klasę Server.java? Wiem, że UnknwnHostException zostanie rzucony, gdy wyszukiwanie adresu nie powiedzie się. –

+0

tak, dodano powyżej. –

+0

ten kod byłby zapytaniem o serwery trzęsienia, jaki jest twój pożądany wynik? –

Odpowiedz

4

Znalazłem odpowiedź. Z jakiegoś powodu, trzeba użyć:

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

1

To dziwne, że trzeba to zrobić. java.net.InetAddress.getByName działa dla mnie, po wyjęciu z pudełka.

Istnieje kilka (trwających) problemów związanych z rozpoznawaniem DNS w emulatorze Androida, więc to może być to.

0

nie wiem, czy to była literówka, ale mówiłeś, że masz:

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

Ale to musi być:

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

Próbowałem getByName i działa dobrze.

Czy możesz poprawić swoje uprawnienia i zmienić z getByName na getAllByName w tym samym czasie? Ciekawe, czy możesz potwierdzić, że getByName wciąż nie działa?

1

Miałem podobny problem i dowiedziałem się, że w niektórych wersjach Androida (z plastrów miodu) domyślnie nie jest dozwolone wykonywanie operacji sieciowych z głównego wątku. Możesz to rozwiązać na 2 sposoby. Wykonaj operację w innym wątku lub pozwól na działanie sieciowe w głównym wątku. Aby to zrobić, użyj czegoś takiego:

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

, podczas gdy jest to prawdą, bardzo źle jest robić połączenia w wątku UI, ponieważ blokuje wątek. – momo

+0

dziękuję. Potrzebuję tego rozwiązania ... –

+0

Mimo że to rozwiązanie zadziałałoby, nie jest zalecane i jest złą praktyką. Użyj AsyncTasks do wykonywania operacji sieciowych w innym wątku. – darshanz