Hej!
Piszę w Javie modyfikator schowka systemowego.
Potrafię już rozpoznać jego typ (czy schowek jest dostępny w postaci plaintext).
Chciałbym sprawdzić czy tekst schowka prowadzi do jakiejkolwiek strony internetowej (czy jest linkiem).
Nie interesuje mnie strona a wynikami wyszukiwań w Google (tekst "forum" wpisany w pasku przeglądarki prowadzi do niej).
Wyrażenia regularne nie chcą działać, gdyż pojawiają się też różne dziwne linki.
Pozdrawiam!
Nie pisałem nic sieciowego jeszcze ale może po prostu spróbuj wywołać na danym tekście metodę ping
. Wtedy po otrzymanej odpowiedzi z serwera nie tylko dowiesz się czy tekst jest linkiem ale też możesz sprawdzić czy serwer odpowiada czy nie.
Dzięki! Wpadłem właśnie na taki pomysł jakieś 10 minut temu.
Coś w stylu:
public static boolean isItValidLink (String linkCadidate) {
HttpURLConnection connection = null;
try {
/*
* The next line can throw a MalformedURLException.
*/
URL u = new URL(linkCadidate);
/*
* The next two lines can throw many kinds of exceptions.
*/
connection = (HttpURLConnection) u.openConnection();
connection.setRequestMethod("HEAD");
/*
* Returns -1 if no code can be discerned from the response (i.e., the response is not valid HTTP).
*/
if (connection.getResponseCode() == -1)
return false;
} catch (Exception e) {
return false;
}
return true;
}
Czekam na konstruktywną krytykę tego kodu.
Niestety dla: wp.pl wyrzuca wyjątek... tzn. nie jest to uznawane za URL przez Javę.
Pokaż cały kod
Przecież wp.pl nie jest linkiem.
Dla wp.pl czy też www.wp.pl nie działa opakowanie w javowego URLa.
Dla zdjęcia na facebooku - plik JPG (String rozpoczynający się od https://scontent.fwaw3-1.fna.fbcdn.net/hprofile-xpa1/v/t1.0-1/12105886...) nie działa z kolei ping.
Dlaczego tak się dzieje?
String linkCandidate = "www.wp.pl";
URL u = new URL(linkCadidate);
Wyrzuca wyjątek MalformedURLException. To samo dla "wp.pl".
Ping zależny od systemu:
public static boolean isReachableByPing(String host) {
try{
String cmd = "";
if(System.getProperty("os.name").startsWith("Windows")) {
// For Windows
cmd = "ping -n 1 " + host;
} else {
// For Linux and OSX
cmd = "ping -c 1 " + host;
}
Process myProcess = Runtime.getRuntime().exec(cmd);
myProcess.waitFor();
if(myProcess.exitValue() == 0) {
return true;
} else {
return false;
}
} catch( Exception e ) {
e.printStackTrace();
return false;
}
}
Nie działa dla zdjęcia na facebooku.
Z debuggera wiem, że myProcess.exitValue() wyrzuca 1.
Why?
Z góry dziękuję.
Zapomniałem dodać. Jest to publicznie dostępne zdjęcie.
Klikam prawym i daję na Copy Image Location w Mozilli Firefox.
Sorry, że rozpisałem kilka postów, powinien być jeden :p
www.wp.pl też nie jest linkiem, umieść w pliku html
<a href="www.wp.pl">Wirtualna Polska</a>
i spróbuj się połączyć.
Dokładniej, to jest link, ale nie do serwera tylko do pliku o nazwie www.wp.pl, który musi się znajdować obok pliku html z tym linkiem.
Poprawny URL rozpoczyna się od protokołu, np.
new URL("file://www.wp.pl");
new URL("http://www.wp.pl");
new URL("https://www.wp.pl");
Jeśli chodzi o ping, to nie wiem jaka jest wartość zmiennej host.
Polecenie
Process p = Runtime.getRuntime().exec("ping scontent.fwaw3-1.fna.fbcdn.net");
działa poprawnie. Być może Ty pingujesz do zdjęcia :P, a nie do serwera.
www.wp.pl też nie jest linkiem, umieść w pliku html
Dziękuję za odpowiedź!
Nie rozumiemy się, bo źle napisałem. Chodzi mi o "link" podany jako String w Javie.
Celem mojego programu (podprogramu) jest sprawdzenie dostępności danego adresu.
Prościej: co stanie się, jeśli wpiszemy ten String do paska adresu w przeglądarce.
Nie interesuje mnie strona Google z wynikami wyszukiwań (od kiedy większość przeglądarek ma taką funkcję, że z paska adresu możemy wyszukiwać jak w Google).
Interesuje mnie dostępność zarówno zdjęć czy innych plików, jak i innych nazw (np. wp.pl), z którymi można nawiązać połączenie.
Dlatego ani **ping **ani połączenie po próbie utworzenia URLa niezawsze działa... :(
Jeśli chodzi o ping, to nie wiem jaka jest wartość zmiennej host.
PolecenieProcess p = Runtime.getRuntime().exec("ping scontent.fwaw3-1.fna.fbcdn.net");
działa poprawnie. Być może Ty pingujesz do zdjęcia :P, a nie do serwera.
Tak pingowałem do zdjęcia.
Zauważyłem, że jeśli sprawdzę czy conajmniej jedna metoda (ping albo URL) nawiąże połączenie i zwróci true, można się połączyć, ale nie wiem czy jest to w pełni poprawne rozwiązanie.
Z góry dziękuję!
Ty czegoś nie rozumiesz, jeśli wpiszesz w pasku przeglądarki ciąg znaków np. jasna.dupa
, to przeglądarka dopisze z przodu protokół (http://
) oraz ciąg www
i spróbuje się połączyć z adresem http://www.jasna.dupa
. Natomiast konstruktor w klasie URL niczego nie dopisuje z przodu, Ty musisz podać poprawny adres, łącznie z protokołem.