Jest to ostatecznie rozwiązane z atrybutem "timeout" jQuery AJAX (i JSONP). Zobacz moją własną odpowiedź!Jak sprawdzić, czy port jest otwarty w sieci klienta/zaporze?
Proszę zobaczyć zaktualizowaną część, próbowałem też z apletem. I nie zawaha się przyjąć twojej odpowiedzi, jeśli możesz podać rozwiązanie z implementacją apletu.
Pracuję z aplikacją WWW opartą na języku Java. Moim żądaniem jest sprawdzenie, czy dany port (powiedzmy 1935) jest otwarty lub zablokowany po stronie klienta. Zaimplementowałem "jsonp" (dlaczego "jsonp"? Stwierdziłem, że żądanie "http" za pośrednictwem AJAX nie może działać dla corssdomain dla samej zasady pochodzenia przeglądarki ") AJAX wywołanie na jeden z mojego serwera zawierającego konkretny port. A jeśli serwer zwróci xhr.status == 200
, port jest otwarty. Oto wada, której nie mogę wykonać oczekiwania na wykonanie (synchroniczne), dopóki nie zakończy się połączenie. Oto funkcja JavaScript, której używam.
Jakiekolwiek alternatywne rozwiązanie (musi być rzeczą po stronie klienta musi być równoległa do mojej aplikacji, proszę nie sugeruj python/php/innych języków) jest również mile widziane. Dziękujemy za poświęcony czas.
function checkURL() {
var url = "http://10.0.5.255:1935/contextname" ;
var isAccessible = false;
$.ajax({
url: url,
type: "get",
cache: false,
dataType: 'jsonp',
crossDomain : true,
asynchronous : false,
jsonpCallback: 'deadCode',
complete : function(xhr, responseText, thrownError) {
if(xhr.status == "200") {
isAccessible = true;
alert("Request complete, isAccessible==> " + isAccessible); // this alert does not come when port is blocked
}
}
});
alert("returning isAccessible=> "+ isAccessible); //this alert comes 2 times before and after the AJAX call when port is open
return isAccessible;
}
function deadCode() {
alert("Inside Deadcode"); // this does not execute in any cases
}
------------------------------------------ ---------------AKTUALIZACJA---------------------------------- ------------------------------
Próbowałem z apletem Java (dzięki sugestii Y Martina). To działa dobrze w appletviewer. Ale kiedy dodaję aplet na stronie HTML, daje to wrażliwe wyniki. Podatne w tym sensie, kiedy zmieniam kartę lub zmieniam rozmiar przeglądarki, wartość portAvailable
zmienia się w drukowanej wiadomości.
Kod Applet:
import java.applet.Applet;
import java.awt.Graphics;
import java.net.InetSocketAddress;
import java.net.Socket;
public class ConnectionTestApplet extends Applet {
private static boolean portAvailable;
public void start() {
int delay = 1000; // 1 s
try {
Socket socket = new Socket();
/*****This is my tomcat5.5 which running on port 1935*************/
/***I can view it with url--> http://101.220.25.76:1935/**********/
socket.connect(new InetSocketAddress("101.220.25.76", 1935), delay);
portAvailable = socket.isConnected();
socket.close();
System.out.println("init() giving---> " + portAvailable);
}
catch (Exception e) {
portAvailable = false;
System.out.println("init() giving---> " + portAvailable);
System.out.println("Threw error---> " + e.getMessage());
}
}
public void paint(Graphics g) {
System.out.println("Connection possible---> " + portAvailable);
String msg = "Connection possible---> " + portAvailable;
g.drawString(msg, 10, 30);
}
}
A to jest moja strona HTML (jestem gospodarzem go na tym samym komputerze z innym Tomcat 6, która działa na porcie 9090. Mogę zobaczyć tą stronę z url --->http://101.220.25.76:9090/test/
):
<html>
<body>
<applet code="ConnectionTestApplet" width=300 height=50>
</applet>
</body>
</html>
A jak robie z portu 1935 blokowania i openning?
Utworzono regułę zapory zarówno dla ruchu przychodzącego, jak i wychodzącego dla portu 1935. Sprawdzam otwarty/zablokowany scenariusz portu 1935, wyłączając/włączając obie reguły.
To jest moja S.S.C.C.E. Teraz pomóżcie mi :)
Twój kod sprawdza nie tylko, czy "port" jest otwarty, ale także czy serwer odpowiada na żądanie HTTP. Czy Twój kod musi działać w przeglądarce? Może być apletem Javy rozwiązaniem dla Ciebie? –
Aplet jest opcją, która zależy od dostępności wtyczki java przeglądarki, której chcę uniknąć. Mam ustawiony serwer, który odpowiada na porcie 1935, niezależnie od tego, jaki będzie protokół (tak, to jest HTTP). Otrzymuję również odpowiedź (gdy port jest otwarty). Ale jeśli port jest blokowany po stronie klientów, jak mam tego słuchać? to jest punkt – tusar
@ YvesMartin, czy mógłbyś napisać odpowiedź na temat apletu lub jakiejkolwiek innej implementacji? Tak, chcę, aby kod był wykonywany w przeglądarce. Pomóż mi z tym. – tusar