[JAVA] Strona zwraca błąd -1

Witam.

Mam mały problem gdyż kod (potencjalnie wygląda na dobry) zwraca błąd -1 przy próbie połączenia:

public String CallFunction(String resourceName, String functionName, Mta_args args)

    {

        String requestContent = args.ConvertToJSONString();

       // try

       // {

            String requrl = "http://" + this.ip + ":" + this.port + "/" + resourceName + "/call/" + functionName;

            String result = this.DoPOSTRequest(requrl, requestContent);

            return result;

        //}

        /*catch (WebException ex)

        {

        }*/

    }


    private String DoPOSTRequest(String url, String json)

    {

        try

        {

        	HttpURLConnection req =(HttpURLConnection) new URL(url).openConnection();

        	req.setRequestMethod("POST");

        	req.setInstanceFollowRedirects(true);

        	req.setDoOutput(true);

        	req.setReadTimeout(2000);

            if (!isNull(this.konto.toString()) && !isNull(this.haslo.toString()))

            {

            	Base64 decoder = new Base64();

            	String decodedBytes = decoder.encode(this.konto+ ":" + this.haslo);

            	req.setRequestProperty("Authorization","Basic " + decodedBytes);

            }

            req.setRequestProperty ("Content-Type", "application/x-www-form-urlencoded");


            OutputStreamWriter writer = new OutputStreamWriter(req.getOutputStream());

            writer.write(json);

            writer.close();


            BufferedReader resp = new BufferedReader(new InputStreamReader(req.getInputStream()));

            //DataInputStream resp = new DataInputStream(req.getInputStream());

            int code = req.getResponseCode();

            	if (code != 200)

            		return convertFormat(code);

            String result = resp.readLine();

            if (result.startsWith("error"))

                throw new Exception(result);

            return result;

        }

        catch (NullPointerException ex)

        {

        	return "NE: " + ex.getCause();

        }

        catch (MalformedURLException e)

        {

        	return "MU: " + e.getMessage();

        }

        catch (Exception ex)

        {

        	return "E: " + ex.getMessage();

        }

    }

linijka która zwraca błąd jest tu: (fragment z kodu powyżej)

if (code != 200)

            		return convertFormat(code);

Oraz 2 pytanie:

Jak zrobić by wywołanie powyższego nie zacinało aplikacji (np w trakcie timedout). Aplikacja (pod Android) na naciśnięciu przycisku zacina się do czasu aż nie wyskoczy jakiś błąd (np timedout w przypadku zablokowania połączenia przez zaporę sieciową). W kodzie mam dodane by by pokazywało się okienko ładowania lecz co z tego jak aplikacja po prostu się zacina na chwile. Więc jak to zrobić by to się nie działo?

Dziękuje z góry za każdą podpowiedz i pomoc : )

Pozdrawiam

Na drugie pytanie mogę odpowiedzieć ad hoc, musisz uruchomić obsługę gui (albo funkcji połączenia) na drugim wątku. Ważne by to zrównoleglić. Na pierwsze odpowiem jak skończe czytać kod.

EDIT

Moja odpowiedź ad 1 wydaje się już zbędna link poniżej dobrze opisuje problem - pozdrawiam.

Ad 1: http://stackoverflow.com/questions/1440 … invocation

Ad 2: w .Net jest coś takiego jak Backgroudworker, w javie zapewne jest coś podobnego. Ogólnie rzecz biorąc wrzucasz to wywołanie do osobnego wątka które wykonuje się w tle. Czyli musisz zaznajomić się z wątkami (threads)

wtedy jest zwracany pusty string a np przez przeglądarkę to normalnie działa - więc ewidentny błąd tego kodu

grzelix - mógł byś rozwinąć co konkretnie jest źle w moim kodzie ? : )

System.setProperty(“http.keepAlive”, “false”); nie działa

Przeczytaj cały post a nie tylko 3 pierwsze linijki.

Ja jestem zdania że na forum powiniśmy wskazywać drogę rozwiązania problemu a nie dawać gotowce. Ten link jest w sumie gotowcem tylko trzeba go uważnie przeczytać.

No dobrze prawie działa tylko że:

po dodaniu tego:

req.setRequestProperty("Authorization","Basic " + decodedBytes);

zwraca się pusty string, trzeba albo dać gotowy string albo wy komentować to i wtedy jest zwracana poprawna wartość. Jakieś sugestie co do tego? Class przetwarzania kodu na base64 wygląda tak:

public class Base64 {


    private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

            + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+/";


    private static final int splitLinesAt = 76;


    public static byte[] zeroPad(int length, byte[] bytes) {

        byte[] padded = new byte[length]; // initialized to zero by JVM

        System.arraycopy(bytes, 0, padded, 0, bytes.length);

        return padded;

    }


    public String encode(String string) {


        String encoded = "";

        byte[] stringArray;

        try {

            stringArray = string.getBytes("UTF-8"); // use appropriate encoding string!

        } catch (Exception ignored) {

            stringArray = string.getBytes(); // use locale default rather than croak

        }

        // determine how many padding bytes to add to the output

        int paddingCount = (3 - (stringArray.length % 3)) % 3;

        // add any necessary padding to the input

        stringArray = zeroPad(stringArray.length + paddingCount, stringArray);

        // process 3 bytes at a time, churning out 4 output bytes

        // worry about CRLF insertions later

        for (int i = 0; i < stringArray.length; i += 3) {

            int j = ((stringArray[i] & 0xff) << 16) +

                ((stringArray[i + 1] & 0xff) << 8) + 

                (stringArray[i + 2] & 0xff);

            encoded = encoded + base64code.charAt((j >> 18) & 0x3f) +

                base64code.charAt((j >> 12) & 0x3f) +

                base64code.charAt((j >> 6) & 0x3f) +

                base64code.charAt(j & 0x3f);

        }

        // replace encoded padding nulls with "="

        return splitLines(encoded.substring(0, encoded.length() -

            paddingCount) + "==".substring(0, paddingCount));


    }

    public static String splitLines(String string) {


        String lines = "";

        for (int i = 0; i < string.length(); i += splitLinesAt) {


            lines += string.substring(i, Math.min(string.length(), i + splitLinesAt));

            lines += "\r\n";


        }

        return lines;


    }


}