套接字连接在独立的“main(..)”类中运行良好,但在servlet环境中超时

时间:2012-10-30 16:49:44

标签: java windows networking servlets operating-system

让我通过一个场景解释问题:

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。所以我想再次重新提出我的问题:

  • 操作系统(Window 7)是否会以某种方式阻止tomcat发出Http请求?
  • 他们在Window 7下的任何配置是否允许应用程序在浏览器之外发出Http请求?
  • 我曾经看过Mozilla Firefox(我从一个被复制而不是被安装的目录运行,即可能没有管理员权限而且没有窗口注册表)从来没有能够定期更新对自己。

1 个答案:

答案 0 :(得分:0)

我知道您更喜欢坚持这不是防火墙问题(因为相同的代码与独立的Java程序运行良好),但我愿意冒这个风险。

如果您完全确定在两种情况下都运行相同的代码(独立案例和Tomcat案例),则仍有可能是防火墙问题。

Windows 7中的内置防火墙为每个端口的每个进程分配出站规则。您的独立程序是否可能与允许出站访问的JVM一起运行,而您的Tomcat服务器是否可以使用未允许出站访问的JVM运行?

换句话说,您是否完全确信您的独立程序和Tomcat服务器是由同一个JVM运行的?同样java.exe?在Windows下,您的独立程序可能实际上由javaw.exe运行。

(你没有提到你是否试图完全禁用防火墙。如果你可以完全禁用防火墙,我建议你这样做,以便进行故障排除)