【问题标题】:Socket connection runs fine in stand alone "main(..)" class, but times out in servlet enviornment套接字连接在独立的“main(..)”类中运行良好,但在 servlet 环境中超时
【发布时间】:2012-10-20 01:56:00
【问题描述】:

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

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();
    }

}

给出的代码示例可能看起来不干净,但需要注意的是,当通过正确的 URL(以及任何输出流)从 Servlet 调用上述方法时,永远不会建立连接。

我在本地机器上的 tomcat 上运行所有这些,它在某个公司网络中(你可能不想得到关于防火墙的任何结论,因为相同的代码在 p.s.v.main 下运行)。

请帮忙....

提前致谢。

编辑:我在家里尝试了一些相同的方法,它按预期工作得很好。 我猜这个问题更多地属于操作系统领域而不是java。所以我想再次改写我的问题:

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

【问题讨论】:

  • 你在这两种情况下使用相同的 jar 集
  • 是的,我想我在代理后面。我可以看到在 Internet Explorer 中设置了代理,但我不明白这是否是原因,因为在 public static void main(..) 线程中仍然可以使用相同的代码。
  • 是的,如果您仔细查看代码,我想在某种意义上我使用的是同一组 jar,我只是使用 servlet 规范(这是由 tomcat 提供的运行时依赖项)和 java.net 包。因此,我看不到来自外部 jar 的太多依赖。

标签: java windows networking servlets operating-system


【解决方案1】:

我了解您更愿意坚持这不是防火墙问题(因为相同的代码可以作为独立的 Java 程序运行良好),但我愿意在这里冒险。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 2019-04-06
    • 2014-01-17
    • 1970-01-01
    相关资源
    最近更新 更多