让我通过一个场景解释问题:
1)用户访问我的页面“www.proxy4html.com”,填写表格:
web-address: |www.google.co.in |
2)点击提交。
3)在浏览器地址栏中获取带有“www.proxy4html.com”的谷歌主页。
现在从web获取内容我正在使用 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 (以及任何输出流)时,永远不会建立连接。 / p>
我在我的tomcat上运行所有这些,这是在我的本地机器上,这是在一些公司网络中(你可能不希望得到任何关于防火墙的结论,因为相同的代码在p.s.v.main下运行)。
请帮忙......
提前致谢。
编辑:我在家里尝试过一些,并且按预期工作正常。 我想这个问题更多地涉及操作系统领域而不是java。所以我想再次重新提出我的问题:
答案 0 :(得分:0)
我知道您更喜欢坚持这不是防火墙问题(因为相同的代码与独立的Java程序运行良好),但我愿意冒这个风险。
如果您完全确定在两种情况下都运行相同的代码(独立案例和Tomcat案例),则仍有可能是防火墙问题。
Windows 7中的内置防火墙为每个端口的每个进程分配出站规则。您的独立程序是否可能与允许出站访问的JVM一起运行,而您的Tomcat服务器是否可以使用未允许出站访问的JVM运行?
换句话说,您是否完全确信您的独立程序和Tomcat服务器是由同一个JVM运行的?同样java.exe
?在Windows下,您的独立程序可能实际上由javaw.exe
运行。
(你没有提到你是否试图完全禁用防火墙。如果你可以完全禁用防火墙,我建议你这样做,以便进行故障排除)