【发布时间】:2012-02-14 18:25:14
【问题描述】:
这最终通过 jQuery AJAX(和 JSONP)的“超时”属性解决。看我自己的答案!
请看更新的部分,我也试过用applet。如果您可以提供小程序实现的解决方案,将毫不犹豫地接受您的回答。
我正在使用基于 Java 的 Web 应用程序。我的要求是检查特定端口(比如 1935)在客户端是打开还是阻塞。我已经实现了“jsonp”(为什么是“jsonp”?我发现通过 AJAX 的“http”请求不能用于浏览器“同源策略”的 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 Applet(感谢 Y Martin 的建议)。这在 appletviewer 中运行良好。但是当我在 HTML 页面中添加小程序时,它会给出易受攻击的结果。从某种意义上说,当我更改选项卡或调整浏览器大小时,portAvailable 的值在打印的消息中被更改。
小程序代码:
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 托管它,该 Tomcat 6 在端口 9090 上运行。我可以使用 url 查看此页面 ---> @987654321@):
<html>
<body>
<applet code="ConnectionTestApplet" width=300 height=50>
</applet>
</body>
</html>
我是怎么做 1935 端口的阻塞和打开的?
我已经为端口 1935 的入站和出站创建了防火墙规则。 我通过禁用/启用这两个规则来检查端口 1935 的打开/阻塞情况。
这是我的S.S.C.C.E。现在请帮助我:)
【问题讨论】:
-
您的代码不仅会测试“端口”是否打开,还会测试是否有服务器响应 HTTP 请求。您的代码需要在浏览器中运行吗?可能是 Java 小程序适合您的解决方案?
-
Applet 是一个选项,它取决于浏览器的 java 插件的可用性,我想避免这种情况。我已经设置了一个在端口 1935 上应答的服务器,无论协议是什么(是的,它是 HTTP)。我也收到回复(当端口打开时)。但是,如果端口在客户端被阻塞,我该如何收听呢?这就是重点
-
@YvesMartin,您能否发布有关小程序或任何其他实现的答案?是的,我希望代码在浏览器上执行。请帮我解决这个问题。
-
无法想象即使问题被其他人收藏,人们也会投减票,请投反对票的人说出他的理由,以便我改进帖子吗?
-
真诚更新后的小程序代码……比以前更不清晰了。 “我如何阻止/打开 1935 端口”是什么意思。你确定这仍然是同一个问题吗? Applet 中的硬编码值是否存在问题 - 如果是这样,有一种方法可以将参数从 HTML 传递到 Applet。如果您收到诸如安全异常之类的错误消息,请告诉我们 - 您必须使用证书对其进行签名。如果您想对测试结果做出反应,我建议您调用“showDocument”来重定向浏览器页面。
标签: java javascript jquery jakarta-ee jsonp