Java - Invalid Http response

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Zamčeno
Matiseli
Level 2.5
Level 2.5
Příspěvky: 381
Registrován: 24 čer 2014 19:30
Bydliště: Podíváte-li se roku 2023 na oblohu, tak na té planetě více v pravo

Java - Invalid Http response

Příspěvek od Matiseli »

Zdravím,
včera jsem se setkal s potíží, kterou já ne a ne vyřešit.

Popis výjimky
Při opakovaném připojení na stejný webový server (nikoli stejnou webovou stránku) není - po 8 projití cyklu - schopna Java onu stránku přečíst:

Kód: Vybrat vše

 java.io.IOException: Invalid Http response
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
	at jádro.Databáze.přečtiObsah(Databáze.java:22)
	at jádro.Panřídící.běž(Panřídící.java:159)
	at jádro.VolbaJazyku.main(VolbaJazyku.java:135)
Používám JRE 8.
===============================================================
Dodatek:
Webový server: http://www.game-debate.com
Aplikace, při níž nastane výjimka: http://www.game-debate.com/games/index. ... 0To%20Hell
===============================================================

Děkuji za odpověď.
Uživatelský avatar
domitea
Tvůrce článků
Příspěvky: 1971
Registrován: 24 čer 2009 19:46
Bydliště: Královehradecký kraj
Kontaktovat uživatele:

Re: Java - Invalid Http response

Příspěvek od domitea »

Bez zdrojáku toho moc nezjistím, ale na začátek bych zkusil dělat názvy bez diakritiky. Ona to sice Java umožňuje, ale aplikace zase ne ;)
Matiseli
Level 2.5
Level 2.5
Příspěvky: 381
Registrován: 24 čer 2014 19:30
Bydliště: Podíváte-li se roku 2023 na oblohu, tak na té planetě více v pravo

Re: Java - Invalid Http response

Příspěvek od Matiseli »

Zkrácený zdrojový kód:

Kód: Vybrat vše

//Opakovat, dokud nebyly projity všechny webové stránky (indexy v proměnném poli "weby"):
for(byte indexWeby = 0; weby.get(indexWeby).equals("konec") == false; indexWeby++){
try {
	inter = new Internet(weby.get(indexWeby));
	System.out.println("Vytvářím databázi dle předlohy www stránky \""+weby.get(indexWeby)+"\"");
} catch (IOException výjimka) {
	System.err.println();
	soubor.připiš(výjimka.toString(), cestaKsouboru+výjimky, "chyba zápisu!");
	return stav = false;
}

try {
	//Přidání obsahu webové stránky (html5 kódy) do Stringu:
	obsah.append(data.přečtiObsahLogicky(inter.vraťPřipojení(), musíObsahovat));
	inter = null;
} catch (IOException | URISyntaxException výjimka) {
	System.err.println("Mali");
	soubor.připiš(výjimka.toString(), cestaKsouboru+výjimky, "chyba zápisu!");
	return stav = false;
}
/**Získávání odkazů z každé webové stránky databáze:*/
//Opakovat, dokud se nezapsali všechny aplikace z databáze do daného souboru:
while(sb.obsahuje(obsah, začOdkaz) == true){	
sb.odstraňZačátek(obsah, začOdkaz);
obsah.delete(0, začOdkaz.length());
try {
	if(sb.kdyObsahuje(obsah, musíObsahovat) < obsah.length()){
		System.out.println("P 1.");
	indexApp = Short.valueOf(obsah.substring(0, sb.kdyObsahuje(obsah, "&")));
	//Pokud databáze ("má") neobsahuje vícekrát informace o stejné aplikaci:
	if(indexApp != posledníOdkaz && obsah.substring(0, sb.kdyObsahuje(obsah, konOdkaz)).endsWith("#systemrequirements") == true){
	System.out.println("Podmínka 2!");
	soubor.vytvořSoubor(celýNázSoubor);
	soubor.zapiš(obsah.substring(0, sb.kdyObsahuje(obsah, konOdkaz)).replace(musíObsahovat, "]").replace(" ", "").toLowerCase(), 
		         celýNázSoubor, "Výjimka!");
	posledníOdkaz = indexApp;
    inter = new Internet("http://www.game-debate.com/games/index.php?g_id="+indexApp);
    obsahHardware.append(data.přečtiObsah(inter.vraťPřipojení()));
    inter = null;
    //Naplnění Stringu pro pozdější hledání hardwarů v nich (tato akce platí pouze, když daný údaj ona webová stránka obsahuje):
    	proRam.append(obsahHardware.substring(sb.kdyObsahuje(obsahHardware, začRam)));
    	proCpu.append(obsahHardware.substring(sb.kdyObsahuje(obsahHardware, začCpu)));
    	hdd.append(obsahHardware.substring(sb.kdyObsahuje(obsahHardware, začHdd)));
    	proDirectx.append(obsahHardware.substring(sb.kdyObsahuje(obsahHardware, začDirectx)));
    	System.out.println("prodir: "+proDirectx);
      	os.append(obsahHardware.substring(sb.kdyObsahuje(obsahHardware, začOs)));
    	proGpu.append(obsahHardware.substring(sb.kdyObsahuje(obsahHardware, začGpu)));
    
    //Zjišťování a následné přidání do StringBuilderu - pro pozdější zapsání do souboru - informace o minimální velikosti RAM.
    	while(sb.obsahuje(proRam, začRam) == true){
		sb.odstraňZačátek(proRam, začRam);
		ram.add(proRam.substring(0, sb.kdyObsahuje(proRam, " GB")));
		sb.odstraňZačátek(proRam, "</span>");
		}
		proRam.setLength(0);
    	//Zjišťování obsahžených grafických karet ve zdrojových kódech databáze:
		while(sb.obsahuje(proGpu, začGpu) == true){
		sb.odstraňZačátek(proGpu, začGpu);
		if(proGpu.substring(0, 250).contains(konGpu) == true){
		grafKarty.add((proGpu.substring(0, sb.kdyObsahuje(proGpu, "\" title=")).replace(začGpu, ""))+"&");
		sb.odstraňZačátek(proGpu, konGpu);
		}
		else{
		proGpu.deleteCharAt(0);
		}
		}
		proGpu.setLength(0);
		
		//Vyjmutí z databáze informací o minimalním rozhraní DirectX:
		while(sb.obsahuje(proDirectx, začDirectx) == true){	
		sb.odstraňZačátek(proDirectx, začDirectx);
		directx.add(proDirectx.substring(0, sb.kdyObsahuje(proDirectx, "</span>")));
		System.out.println("directx: "+proDirectx.substring(0, 1000));
		sb.odstraňZačátek(proDirectx, "</span>");
		}
		proDirectx.setLength(0);
		//Zjištění informace ohledně místa volného na úložném zařízení:
		if(hdd.length() > 250 && sb.obsahuje(hdd, začHdd) == true){
		sb.odstraňKonec(hdd, "</span>");
		}
		//Zjišťování informace o operačním systému:
		if( os.length() > 250 && sb.obsahuje(os, začOs) == true){
		sb.odstraňKonec(os, "</span>");
		}
   //Zjistit, zda obsah www stránky určený ve Stringu "proCpu", obsahuje pro mě nějaká užitečná data. 
   while(sb.obsahuje(proCpu, konCpu) == true){
   //Vyhledávání procesorů v textovém řetězci "proCpu": 
   sb.odstraňZačátek(proCpu, začCpu);

   if(proCpu.substring(0, 250).contains(konCpu) == true){
	procesory.add((proCpu.substring(0, sb.kdyObsahuje(proCpu, konCpu)).replace(začCpu, ""))+"&");
	sb.odstraňZačátek(proCpu, konCpu);
   }
   else{
   proCpu.deleteCharAt(0);
   }
}
   proCpu.setLength(0);
   procesory.trimToSize();
	//Zapsání údajů z webové stránky do určeného souboru:
   soubor.novýŘádek(celýNázSoubor);
   soubor.připiš("procesory: "+procesory.toString(), celýNázSoubor, "Výjimka");
   soubor.novýŘádek();
		soubor.připiš("grafické karty: "+grafKarty.toString(), celýNázSoubor, "Výjimka");
   soubor.novýŘádek();
   		soubor.připiš("operační paměť: ", celýNázSoubor, "Výjimka");
		if(ram.size() != 0){
        soubor.připiš(ram.toString().replace(začRam, ""), celýNázSoubor, "Výjimka");
		}
        else{
        soubor.připiš("null", celýNázSoubor, "Výjimkas");	
		}
   soubor.novýŘádek();	
   		soubor.připiš("nutné místo na disku: ", celýNázSoubor, "Výjimkas");
		if(hdd.length() > 0 && sb.obsahuje(hdd, začHdd) == true){
		soubor.připiš(hdd.toString().replace(začHdd, ""), celýNázSoubor, "Výjimkas");
		}
		else{
		soubor.připiš("null", celýNázSoubor, "Výjimkas");
		}
   soubor.novýŘádek();
        soubor.připiš("directx: ", celýNázSoubor, "Výjimka");
        if(directx.size() != 0){
        soubor.připiš(directx.toString().replace(začDirectx, ""), celýNázSoubor, "Výjimka");	
        }
        else{
        soubor.připiš("null", celýNázSoubor, "Výjimka");
        }
   soubor.novýŘádek();
   		soubor.připiš("operační systém: ", celýNázSoubor, "Výjimka");
        if(os.length() > 0 && sb.obsahuje(os, začOs) == true){
        soubor.připiš(os.toString().replace(začOs, ""), celýNázSoubor, "Výjimka");	
        }
        else{
    	soubor.připiš("null", celýNázSoubor, "Výjimkas");	
		}
	//Zvýšení indexu u proměnné "názevSouboru" pro následnou tvorbu souboru nového:
	názevSouboru++;	
	celýNázSoubor = cestaKsouboru+aplikace+File.separatorChar+(názevSouboru+".txt");
}

	hdd.setLength(0);
	os.setLength(0);
	directx.clear();
	obsahHardware.setLength(0);
	ram.clear();
	procesory.clear();
	grafKarty.clear();
	} }catch (IOException | URISyntaxException výjimka) {
	System.err.println("Výjimka!");
	výjimka.printStackTrace();
	soubor.připiš(výjimka.toString(), cestaKsouboru+výjimky, "chyba zápisu!");
	return stav = false;
}


//Pomínky sloužící pro projití i aplikací z minulých let:
if(weby.get(indexWeby).contains("year=") && rok >= rok - 14){
//Starší ročník počítačových her:
if(weby.get(indexWeby).contains("list=software") == false){
weby.remove(indexWeby);
weby.add((indexWeby), "http://www.game-debate.com/games/index.php?year="+(rok-=1));
}
//Starší ročník ostatních softwarů:
else{
weby.remove(indexWeby);
weby.add(indexWeby,"http://www.game-debate.com/games/index.php?list=software&year="+(rok-=1));
}
indexWeby -= 1;
}
//Pokud byli projity všechny aplikace daného druhu:
if(rok == (nynRok - 14)){	
rok = nynRok;
indexWeby += 1;
}
}
obsah.setLength(0);
System.out.println("SMAZÁN OBSAH!");
}
začOdkaz = null;
konOdkaz = null;
musíObsahovat = null;
začCpu = null;
konCpu = null;
začHdd = null;
začGpu = null;
konGpu = null;
začDirectx = null;
začRam = null;
začOs = null;
proCpu = null;
hdd = null;
proDirectx = null;
proRam = null;
os = null;
proGpu = null;
ram = null;
directx = null;
grafKarty = null;
obsahHardware = null;
procesory = null;
System.gc();
PS: Co máš na mysli tím "Java to umožňuje, ale aplikace ne." - Vždyť aplikace vlastně "běží" na Javě. Prosím o upřesnění.
Uživatelský avatar
domitea
Tvůrce článků
Příspěvky: 1971
Registrován: 24 čer 2009 19:46
Bydliště: Královehradecký kraj
Kontaktovat uživatele:

Re: Java - Invalid Http response

Příspěvek od domitea »

No, Java sice kóduje zdrojáky v UTF-8, ale aplikace jsou většinou psané tak, že to prostě nedávají. Navíc, když něco posíláš s diakritikou nějaké jiné aplikaci (Která nemusí být napsaná v javě), tak ta diakritika může nadělat pěknou paseku ;)
Matiseli
Level 2.5
Level 2.5
Příspěvky: 381
Registrován: 24 čer 2014 19:30
Bydliště: Podíváte-li se roku 2023 na oblohu, tak na té planetě více v pravo

Re: Java - Invalid Http response

Příspěvek od Matiseli »

Díky za informace.
Jinak, má bádání pokročilo: Http response kód se rovná -1 (což je ovšem divné, vždy nacházím response kódy pouze v kladných číslech).

==================================================================================================================
Aktualizace: -1 response kód znamená, že nelze z URL rozeznat jakékoli kódy (připojení Http není platné).

--- Doplnění předchozího příspěvku (21 Lis 2014 21:42) ---

Kód: Vybrat vše

public int vraťResponseCode() throws IOException{
připojení = (HttpURLConnection)urlAdresa.openConnection();
return připojení.getResponseCode();	
}
Zajistí zjištění response kódu (kódu "úspěšnosti připojení").
...
Dále jsem zjistil, že zrovna ona aplikace 99 Levels To Hell má v URL adrese (za &game=)místo mezer "%". Takže, pokud použiji tuto podmínku a přilehlý blok k tomu:...

Kód: Vybrat vše

    if(inter.vraťResponseCode() == -1){
    String úpravURL = obsah.substring(0, sb.kdyObsahuje(obsah, konOdkaz)).replace(musíObsahovat, "]").replace(" ", "%").toLowerCase();
    inter = new Internet("http://www.game-debate.com/games/index.php?g_id="+úpravURL);
    }
kde String úpravURL uloží do paměti text "[číslo aplikace]&game=99%levels%to%die"

...Bezpotíží se připojím :).
Budu kdyžtak rád za každou připomínku.
Zamčeno

Zpět na „Programování a tvorba webu“