getInputStream() funktioniert nicht

  • Antworten:4
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 5

27.12.2016 14:38:26 via Website

Hallo, ic h habe immer wieder mal Probleme mit der Metode "urlConnection.getInputStream()". Mal funktionierts mal nicht und ich weiß nicht woran es liegt. Hier ein Codebeispiel:

import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
* Created by Lothar on 26.12.2016.
*/
public class Charakter {
String username;
int ep, lvl, hp, hpmax, gs;

Charakter(String username, int ep, int lvl, int hp, int hpmax, int gs){
    this.username = username;
    this.ep = ep;
    this.lvl = lvl;
    this.hp = hp;
    this.hpmax = hpmax;
    this.gs = gs;
}

public void speichern(){
    try
    {
        URL url = new URL("meine URL");
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection.setDoInput(true);
        urlConnection.setDoOutput(true);
        urlConnection.setRequestMethod("POST");

        urlConnection.getOutputStream().write(("daten= ").getBytes());
        urlConnection.getOutputStream().write((username+",").getBytes());
        urlConnection.getOutputStream().write((Integer.toString(ep)+",").getBytes());
        urlConnection.getOutputStream().write((Integer.toString(lvl)+",").getBytes());
        urlConnection.getOutputStream().write((Integer.toString(hp)+",").getBytes());
        urlConnection.getOutputStream().write((Integer.toString(hpmax)+",").getBytes());
        urlConnection.getOutputStream().write((Integer.toString(gs)+",").getBytes());



        InputStream is = urlConnection.getInputStream();
        InputStreamReader input = new InputStreamReader(is, "UTF8");
        BufferedReader reader = new BufferedReader(input, 2000);
        final List<String> list = new ArrayList<String>();
        String line = reader.readLine();
        while (line != null) {
            list.add(line);
            line = reader.readLine();

        }
        urlConnection.disconnect();
    }catch(IOException e){
        Log.e("Error","Es ist ein Fehler aufgetreten " + e);
    }

}

}

Die Klasse wird von einer activity aufgerufen und schreibt einige Daten über ein php-script in eine MySql-Datenbank. Das php-script gibt die Daten zur Kontrolle durch echo zurück.
Das Programm wirft eine IO-Exception bei " InputStream is = urlConnection.getInputStream();"
Setze ich die Zeile vor "urlConnection.getOutputStream().write(("daten= ").getBytes());", bekomme ich den Inputstream. Dann jedoch steigt das Programm in der nächsten Zeile aus bei "urlConnection.getOutputStream().write(("daten= ").getBytes());".
Ist es so, dass sich Input und Output in die Quere kommen? Seltsam dann nur, dass es manchmal funktioniert.
Im Log habe ich übrigens keine Fehlermeldung gefunden.
Vielleicht weiß ja jemand weiter.

Gruß Lothar.

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.305

27.12.2016 17:48:16 via Website

Du schickst die falsche PostData Query ab.
PostDaten müssen mit dem Delmiter & getrennt sein, falls es unterschiedliche Keys sind...

Mach dir es doch eifncher indem du die Daten in einer HashMap ablegst.

Und machst du dein Stream nicht zu mit nem flush und Close??
Schau dir mal das hier an:
http://stackoverflow.com/questions/9767952/how-to-add-parameters-to-httpurlconnection-using-post

Ansonsten kann ich dir http Libs wie Ion,OkHttp oder Volley empgehlen, da sparst du dir das ganze encodeieren etc. die können das so.

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

  • Forum-Beiträge: 5

28.12.2016 11:59:31 via Website

Danke, Pascal, für die Antwort.
Du meinst, die Daten für den Outputstream müssen durch '&' getrennt sein? Das ist vermutlich der Fall, wenn man sie in einen Befehl packt, oder? Sicher, das könnte man eleganter machen. Doch hier ist nicht das Problem. Die Daten kommen richtig an und werden richtig verarbeitet.
Das Problem ist, dass ich nicht den Inputstream zur Kontrolle bekomme um die mit 'echo' zurückgesendeten Daten zu lesen. Seltsam ist, dass es an anderer Stelle funktioniert hat.
Ich weiß leider nicht, was 'flush und Close' ist.
Mit einer HashMap habe ich noch nicht gearbeitet. Inwiefern ist das einfacher?

Grüße,

Lothar

  • Forum-Beiträge: 5

28.12.2016 12:11:08 via Website

Ich nutze keinen 'OutputStreamWriter', sondern schreibe die Daten direkt in den Outputstream, des halb kein flush und close'. Wäre es besser, einen solchen writer zu verwenden?

Gruß,

Lothar

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.305

28.12.2016 12:25:50 via App

Ja da kann man besser mit Arbeiten da die Daten erst gesendet werden wenn vollständig.

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