Это, наконец, решение с атрибутом «timeout» jQuery AJAX (и JSONP). Смотрите мой собственный ответ!Как проверить, открыт ли порт в сети клиента/брандмауэре?
Пожалуйста, ознакомьтесь с обновленной частью, я также попробовал апплет. И не стесняйтесь принять ваш ответ, если вы сможете дать решение с реализацией апплета.
Я работаю с веб-приложением на основе Java. Мое требование - проверить, открыт или заблокирован конкретный порт (например, 1935) на стороне клиента. Я реализовал «jsonp» (почему «jsonp»? Я обнаружил, что запрос «http» через AJAX не может работать для corssdomain для той же политики происхождения браузеров). AJAX-вызов на один из моих серверов, содержащих определенный порт. И если сервер возвращает xhr.status == 200
, то порт открыт. Вот недостаток, который я не могу заставить ждать выполнения (синхронно) до завершения вызова. Вот функция JavaScript, которую я использую.
Любое альтернативное решение (должно быть на стороне клиента должно быть параллельно с моим приложением, пожалуйста, не предлагайте python/php/другие языки) также приветствуется. Спасибо за ваше время.
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
}
------------------------------------------ ---------------ОБНОВИТЬ---------------------------------- ------------------------------
Я пробовал использовать Java-апплет (благодаря предложению Y Мартина). Это отлично работает в appletviewer. Но когда я добавляю апплет в HTML-страницу, он дает уязвимые результаты. Уязвимым в смысле, когда я изменяю вкладку или изменяю размер браузера, значение portAvailable
изменяется в напечатанном сообщении.
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);
}
}
И это мой HTML страницы (я разместить его на одном компьютере с другой Tomcat 6, который работает на порту 9090. Я могу просматривать эту страницу с URL --->http://101.220.25.76:9090/test/
):
<html>
<body>
<applet code="ConnectionTestApplet" width=300 height=50>
</applet>
</body>
</html>
и как я делаю порт 1935 блокирования и открывающиеся?
Я создал правило брандмауэра как для входящего, так и исходящего для порта 1935. Я проверяю сценарий открытия/блокировки порта 1935, отключив/разрешив оба правила.
Это мой S.S.C.C.E. Теперь, пожалуйста, помогите мне :)
Ваш код не только проверяет, открыт ли «порт», но также есть сервер, отвечающий на HTTP-запрос. Нужен ли ваш код для запуска в браузере? Может быть, апплет Java для вас? –
Апплет - это вариант, который зависит от доступности java-плагина браузера, которого я хочу избежать. Я настроил сервер, который отвечает на порт 1935 независимо от протокола (да, это HTTP). Я также получаю ответ (когда порт открыт). Но если порт заблокирован на конце клиента, как я его слушаю? это точка – tusar
@YvesMartin, не могли бы вы разместить сообщение об апплете или любой другой реализации? Да, я хочу, чтобы код выполнялся в браузере. Пожалуйста, помогите мне с этим. – tusar