Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插座连接在独立状态下运行良好”;主要(……)”;类,但在servlet环境中超时_Java_Windows_Networking_Servlets_Operating System - Fatal编程技术网

Java 插座连接在独立状态下运行良好”;主要(……)”;类,但在servlet环境中超时

Java 插座连接在独立状态下运行良好”;主要(……)”;类,但在servlet环境中超时,java,windows,networking,servlets,operating-system,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(尽管为了解决这个问题,我也尝试了其他几个选项)。如果代码独立运行,则其工作方式与预期相同 (也就是说,当运行

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

1) 用户访问我的页面“www.proxy4html.com”,填写以下表格:

            web-address: |www.google.co.in |
2) 单击提交

3) 获取浏览器地址栏中带有“www.proxy4html.com”的谷歌主页

现在,为了从web获取内容,我正在使用java.net.HttpURLConnection(尽管为了解决这个问题,我也尝试了其他几个选项)。如果代码独立运行,则其工作方式与预期相同

(也就是说,当运行公共静态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(以及任何outputstream)时,永远不会建立连接

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

请帮忙

提前谢谢

编辑:我在家里也试过同样的方法,效果很好我想这个问题更多地属于操作系统领域,而不是java。所以我想重新表述一下我的问题:

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

我知道您更愿意坚持这不是防火墙问题(因为同一代码作为独立Java程序运行良好),但我愿意在这里冒险

如果您完全确定在这两种情况下(单机情况和Tomcat情况)都运行相同的代码,那么仍然有可能是防火墙问题

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

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


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

您是否在两种场景中使用相同的JAR集我想我是在代理之后。我可以看到Internet explorer中设置了代理,但我不明白这是否是原因,因为相同的代码仍然在公共静态void main(..)线程中工作。是的,我想在某种意义上我使用的是相同的JAR集,如果您仔细看一下我使用的代码,我只是使用servlet规范(这是tomcat提供的运行时依赖项)和java.net包。因此,我看不到来自外部jar的太多依赖性。