asynctask, unknownhostexception

  • Antworten:11
Wicki11
  • Forum-Beiträge: 103

16.08.2018, 11:10:38 via Website

Hallo,
ich will in meiner Android-App durch die AsyncTask-Methode doInBackground eine Datei einlesen von einem eigenen Server. Dabei erhalte ich die obige Exception bei Ausführung des Codes:

url=new URL("http://acer_laptop/ccsetup542.exe");
connection = (HttpURLConnection) url.openConnection();
connection.connect();

Wenn ich statt des Servernamens die IP-Adresse setze funktioniert das.
Auch unter Chrome (auf dem Smartphone) funktioniert es mit dem Servernamen.
Bitte um Hilfe !

Nachfolgend der Code-Ausschnitt:

protected String doInBackground(String... sUrl) {
  InputStream input = null;
  OutputStream output = null;
  HttpURLConnection connection = null;
  try {
    URL url=new URL("http://ACER_LAPTOP/ccsetup542.exe"); //steht in sUrl
    connection = (HttpURLConnection) url.openConnection();
    connection.connect();  //Exception
    if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
      return "Server returned HTTP " + connection.getResponseCode()
              + " " + connection.getResponseMessage();
    }
   int fileLength = connection.getContentLength();
   // download the file
   input = connection.getInputStream();

— geändert am 16.08.2018, 11:13:28

Antworten
Jokel
  • Forum-Beiträge: 1.527

16.08.2018, 11:25:51 via Website

Hi

hast du in deinen Lokalen Netz auch so was wie einen DNS Server der dir die Adresse auflöst?

Das was du da angibst ist ist keine URL. Das ist eine Server Adresse im Lokalen Netz.

— geändert am 16.08.2018, 11:33:55

Antworten
Wicki11
  • Forum-Beiträge: 103

16.08.2018, 16:10:41 via Website

Dank für die Antwort.
Wenn ich in meinem lokalen Netz im Chrome-Browser des Smartphones die URL
http://acer_laptop/index.html
eingebe, so funktioniert das, d.h. DNS ist wirksam.
Ausserdem beim Einsetzen der IP-Adrese für acer_laptop wird es offensichtlich als URL erkannt.

Gruss Wicki

Antworten
Jokel
  • Forum-Beiträge: 1.527

16.08.2018, 17:23:27 via Website

Eine ip ist eine ip und braucht nicht aufgelöst werden.
Deshalb geht das auch ohne Probleme.

Wenn du eine Server Adresse( Hostname mit Path) in den Browser eingibst merkt das der Browser und stellt die Verbindung ich sage mal über einen anderen weg her.
Besser gesagt er ermittelt die IP Adresse meist mit hilfe von Netbios über TCP.

Das hat nichts mit DNS zu tun.

Der Browser ist da intelligenter als die urlconnection.
Die Connection kann nur über einen DNS Server auflösen.
Sie fragt also beim DNS Server nach ob die URL/ FQDN bekannt ist.
Die Adresse des DNS bekommt der Cleint beim DHCP vom Router.
Dein lokaler Rechner ist da natürlich nicht bekannt.
Einen eigenen Server im lokalen Netz hast du nicht.

Wenn du der Connection eine ip (das ist auch eine URL) übergibst ist eine namensauflösung nicht notwendig und sie kann sich gleich über das http Protokoll mit dem Server verbinden.
Ohne muss sie eine nahmensauflösung machen.

Wie eine url aussieht schaue dir das mal im netz an.
Das was du hast ist ein FQDN. URL ist eine untergruppe von FQDN.
Eine URL benutzt einen Hostnamen und eine Domäne getrennt durch einen Punkt.

https://www.neusob.de/ak-inhalt/Protokoll/AufbauURL.asp

https://de.m.wikipedia.org/wiki/Uniform_Resource_Locator
https://de.wikipedia.org/wiki/Namensaufl%C3%B6sung

— geändert am 17.08.2018, 09:37:20

Antworten
swa00
  • Forum-Beiträge: 3.704

16.08.2018, 17:31:51 via Website

@Wiki,

a) setze Deinem Laptop eine feste IP und verwende Diese - eine Fehlerquelle weniger.
b) Bette das bitte mal in ein try catch ein

Und dann wirst du schon sehen , was passiert.

P.S Abgesehen davon , solltest du eher fertige Libraries verwenden , die verstehen etwas von ihrem Handwerk und fangen die 1000 möglichen Fehler bereits für dich ab .
(ION, OKhttp usw.) Warum das Pferd nochmal erfinden ?

— geändert am 16.08.2018, 18:11:00

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Jokel
  • Forum-Beiträge: 1.527

16.08.2018, 17:58:12 via Website

@saw00 richtig man kann auch Libs verwenden .
Mir ging es aber auch darum das er versteht das das war er macht keine richtige URL ist und das eine URL ausgelöst werden muss.
Feste Ip ok kann man machen, nur meistens ist die leas Dauer des DHCP Server im Router so hoch das der Rechner fast immer die gleiche Ip bekommt. Das ist nicht so wie bei DSL wo du immer eine andere Ip bekommst.

Denn er sagt ja mit der ip geht es. Und mit seine vermutlichen Url nicht. Zu mindestens kann die Connection dies nicht auflösen. Und genau das wollte ich Ihm klar machen.

Er sollte die Netzwerk Grundlagen auch verstehen nicht nur anwenden.
Finde das es sinnvoll ist zu wissen was im Hintergrund abläuft

try catch Block , hat er eigentlich. Try ist vorhanden, er sagt auch das es ein code Ausschnitt ist deshalb fehlt wohl der catch.

— geändert am 16.08.2018, 18:13:31

Antworten
Wicki11
  • Forum-Beiträge: 103

16.08.2018, 18:23:21 via Website

Danke sw00 !
Die Ursache des Problems bleibt nun zwar offen, aber ich habe Deinem Rat zufolge eine feste IP-Adresse vergeben.
Noch ein Hinweis, auch für Jokel.
Ich habe mal in meiner App einen Server im Internet aufgerufen mit folgender URL:
URL url = new URL("https://www.ccleaner.com/de-de/ccleaner/download");
Das funktionierte problemlos.

Gruss Wicki

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.08.2018, 18:31:04 via Website

Hallo Wicki,

die beiden haben dir doch schon klarmachen wollen, das das Problem der Hostaufläsung (DNS) nur im Internen Netzwerk problematisch ist, zumindest wenn du nur eine HttpUrlConnection nutzt.
Wenn du voher den Host auflösen willst, kannst du das tun, dann funktioniert es auch per Hostname.

LG Pascal //It's not a bug, it's a feature. :) ;)

Jokel

Antworten
Jokel
  • Forum-Beiträge: 1.527

16.08.2018, 18:53:11 via Website

URL url = new URL("https://www.ccleaner.com/de-de/ccleaner/download");
Das funktionierte problemlos.

Das ist auch eine richtige URL und die ist im Internet wo es einen DNS server gibt.
In deinem lokalen Netz ist kein Dns server der die Auflösung macht.
Und das was du da als Url angibst ist ein Hostname mit Path (FQDN) und keine URL.

Die kann man zwar auch in einen DNS oder Wins Server eintragen sofern man einen hat.

Im normal fall wird das über Netbios über TCP gemacht, und das kann die Connection nicht die arbeitet auf Socket Ebne und kann nur DNS.

Wenn du uns nicht glaubst dann beschäftige dich mal mit Netzwerk Grundlagen.
Links dazu habe ich gegeben.

— geändert am 17.08.2018, 09:26:37

Antworten
Wicki11
  • Forum-Beiträge: 103

16.08.2018, 19:39:56 via Website

Hallo Pascal,

Wenn du voher den Host auflösen willst, kannst du das tun, dann funktioniert es auch per Hostname.

was meinst Du mit "vorher Host auflösen dann funktioniert es auch per Hostname." ?

Antworten
swa00
  • Forum-Beiträge: 3.704

16.08.2018, 20:04:37 via Website

was meinst Du mit "vorher Host auflösen dann funktioniert es auch per Hostname." ?

Umfangreich sicher stellen , dass du im internen LAN einen funktionierenden DNS laufen hast .

Ich glaube das Thema ist aber jetzt durchgeluscht - wir helfen gerne bei programmtechnischen Fragen.
Netzwerktechnologie müsstes du dir bitte selbst aneignen - das sprengt jetzt hier den Rahmen.

— geändert am 16.08.2018, 20:05:16

Liebe Grüße - Stefan
[ App - Entwicklung ]

Jokel

Antworten
Jokel
  • Forum-Beiträge: 1.527

16.08.2018, 20:04:41 via Website

Zb. die Adresse in die host Datei schreiben aber da kommst du nicht ran auf einen nicht gerooteten Gerät.

Schaue dir an wie eim Rechner eine Namesauflösung macht. Das Handy macht es nicht anders.

https://debian-handbook.info/browse/de-DE/stable/sect.hostname-name-service.html
https://de.wikipedia.org/wiki/Namensaufl%C3%B6sung

Ansonsten musst du die Adresse selber mit Netbios auf lösen.
https://www.programcreek.com/java-api-examples/?api=jcifs.netbios.NbtAddress

— geändert am 17.08.2018, 09:28:44

Antworten