让我通过一个场景来解释这个问题:
1)用户访问我的页面“www.proxy4html.com”,填写表格:
web-address: |www.google.co.in |
2) 点击提交。
3) 获取浏览器地址栏中包含“www.proxy4html.com”的 Google 主页。
现在,为了从网络获取内容,我正在使用 java.net.HttpURLConnection (尽管为了解决这个问题,我也尝试了其他几个选项)。如果代码独立运行,则可以按预期工作
(即在运行public static void main(String..)..线程时,它会获取给定网址上的任何html)。
但是在抛出的 Servlet 环境下运行时也是如此
java.net.ConnectException:连接超时:连接
代码如下:
public void write(String urlString, PrintWriter writer) {
URL url;
try {
url = new URL(urlString);
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
HttpURLConnection.setFollowRedirects(false);
huc.setConnectTimeout(15 * 1000 * 60);
huc.setReadTimeout(15 * 1000 * 60);
huc.setRequestMethod("GET");
huc.connect();
InputStream input = url.openStream();
logger.info("got input stream");//I never reach here in servlet env :(
int i = 0;
while((i = input.read()) != -1) {
writer.write(i);
System.out.print((char)i);
}
input.close();
} catch (ConnectException e) {
logger.log(Level.SEVERE, "", e);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
给出的代码示例可能看起来不干净,但要注意的是,当从 Servlet 调用上述方法并传递正确的 URL (以及任何输出流)时,永远不会建立连接。
我正在我的 tomcat 上运行所有这些内容,该 tomcat 位于我的本地计算机上,该计算机位于某个公司网络中(您可能不想得到有关防火墙的任何结论,因为相同的代码在 p.s.v.main 下运行)。
请帮忙......
提前致谢。
编辑:我在家里尝试了一些相同的方法,效果如预期的那样好。 我想这个问题更多地属于操作系统领域而不是java。所以我想再次改写我的问题:
- 操作系统(Window 7)是否以某种方式阻止 tomcat 发出 Http 请求?
- Windows 7 下是否有任何配置不允许应用程序发出浏览器以外的 Http 请求?
- 我曾多次看到 Mozilla Firefox(我从复制而不是安装的目录运行,即可能没有管理员权限并且没有窗口注册表)永远无法进行定期更新自己。
最佳答案
我理解您更愿意坚持认为这不是防火墙问题(因为相同的代码作为独立的 Java 程序运行良好),但我愿意在这里冒险。
如果您绝对确定在两种情况下(独立情况和 Tomcat 情况)都运行完全相同的代码,则仍然有可能是防火墙问题。
Windows 7 中的内置防火墙为每个进程每个端口分配出站规则。是否有可能您的独立程序使用已允许出站访问的 JVM 运行,而您的 Tomcat 服务器则使用不允许出站访问的 JVM 运行?
换句话说,您绝对确信您的独立程序和 Tomcat 服务器由同一个 JVM 运行吗?非常相同的java.exe
?在 Windows 下,您的独立程序可能实际上由 javaw.exe
运行。
(您没有提到是否尝试完全禁用防火墙。如果您可以完全禁用防火墙,我建议您这样做,以便排查问题)
关于java - 套接字连接在独立 "main(..)"类中运行良好,但在 servlet 环境中超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13143873/