Java HttpURLConnection заблокирован на работе, но не Firefox

Добрый день,

У меня есть проблема, касающаяся HttpURLConnection и интернет-ограничений на работе...

Что я пытаюсь сделать:

Я пытаюсь написать программу, которая подключается к сайту http://www.epexspot.com/ и читает историю пиковых и базовых цен на электроэнергию.


Почему я пытаюсь сделать это:

До настоящего времени сбор цен осуществлялся вручную, что является утомительной процедурой. Таким образом, я хотел автоматизировать это с помощью небольшой программы.


Что я сделал до сих пор:

Я написал программу на Java (JDK7u21), использующую HttpURLConnection, пытаясь связаться с домашней страницей и извлечь отправленный ответ; здесь вы можете увидеть в значительной степени то, что я написал:

HttpConnector.java

package network;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

public class HttpConnector {
String urlParameters, method;
URL url;
HttpURLConnection conn;
BufferedReader in;

public HttpConnector(String host, String method) throws IOException{
    if(!host.startsWith("http://") && !host.startsWith("https://"))
        host = "http://" + host;

    this.method = method;
    urlParameters = "";
    url = new URL(host);
}

public HttpConnector(String host, String method, String parameters) throws IOException{
    if(!host.startsWith("http://") && !host.startsWith("https://"))
        host = "http://" + host;

    this.method = method;
    urlParameters = parameters;
    url = new URL(host);
}

public void openConnection() throws IOException{
    conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod(method);
    conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0");
    conn.setRequestProperty("Host", url.getHost());
    conn.setRequestProperty("Connection", "keep-alive");
    if(urlParameters!="" && urlParameters!=null) 
        conn.setRequestProperty("Content-Length", Integer.toString(urlParameters.getBytes().length));
    conn.setRequestProperty("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
    conn.setRequestProperty("Accept-Encoding", "deflate");/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    conn.setUseCaches(false);
    conn.setDoInput(true);
    conn.setDoOutput(true);
}

public void sendRequest() throws IOException{
    if(method == "POST"){
        DataOutputStream out = new DataOutputStream(conn.getOutputStream());
        out.writeBytes(urlParameters);
        out.flush();
        out.close();
    }
}

public ArrayList<String> read() throws IOException{
    if(conn.getResponseCode()>226 || conn.getResponseCode()<200){
        try{
            in = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }catch(NullPointerException e){
            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        }
    }else{
        in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    }
    ArrayList<String> resp = new ArrayList<String>();
    String respTmp;

    while((respTmp=in.readLine())!=null){
        resp.add(respTmp);
    }
    return resp;
}

public void close(){
    if(conn!=null) conn.disconnect();
}

public ArrayList<String> communicate() throws IOException{
    ArrayList<String> resp = new ArrayList<String>();
    try{
        openConnection();
        sendRequest();
        resp=read();
    }catch(Exception e){
        e.printStackTrace(System.err);
    }finally{
        close();
    }
    return resp;
}

}

Main.java

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;

import network.HttpConnector;


public class Main {
    public static void main(String[] args) {
        try{
            File f = new File("response.html");
            if(!f.exists()) f.createNewFile();

//          String host = "http://www.epexspot.com/en/market-data/auction/auction-table/2013-05-28/DE";
// this is where I actually need to go; google.at is merely for testing purposes
            String host = "www.google.at";
            String method = "GET";

            ArrayList<String> response = new ArrayList<String>();
            HttpConnector conn = new HttpConnector(host,method);
            response = conn.communicate();

            FileWriter fw = new FileWriter(f);
            BufferedWriter out = new BufferedWriter(fw);

            for(String resp : response){
                System.out.println(resp);
                out.write(resp+"\n");
            }

            out.flush();
            out.close();
            fw.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

Краткое объяснение: HttpConnector подключается к данному хосту с заданным методом (прежде всего POST или GET) и заданными параметрами URL (хотя я не использую его). Он устанавливает некоторые свойства запроса (например, User-Agent,...) и затем пытается прочитать ответ (через InputStream; если статус ответа говорит, что он неуспешен, через ErrorStream).

Main вызывает HttpConnector с определенным URL (например, www.epexspot.com/en/) и определенным методом (POST или GET). Затем он читает ответ соединения и выводит его на консоль, а также в файл (response.html).


Где моя проблема:

Здесь, на работе, трафик регулируется, что означает, что некоторые домашние страницы заблокированы (так же, как они блокируются в школе). Поэтому, конечно, если я добавлю какой-нибудь URL-адрес для платформы социальных сетей в свою маленькую программу, она выдаст что-то вроде " Ошибка 403 - содержимое страницы заблокировано. Если вам нужна эта страница для работы, обратитесь к администратору ",

Это, например, происходит со мной, когда я пытаюсь перейти на нужную страницу, epexspot.com - НО: страница НЕ блокируется, когда я вызываю ее с помощью обычного Mozilla Firefox (v21). На некоторых страницах моя программа будет работать нормально, но не на большинстве (например, www.google.at, www.ivb.at работают нормально... тогда как большинство других страниц этого не делают)

Я уже пытался заставить свою программу работать так, как если бы она была Firefox в отношении свойств запроса, но до сих пор это не дало никаких результатов... Я пропускаю какое-либо свойство запроса или настройку, которая могла бы заставить программное обеспечение для регулирования Интернета блокировать мою программу, но не Mozilla Firefox?


Итак, мой основной вопрос:

В чем может быть причина того, что моя программа продолжает блокироваться, в то время как Firefox не будет испытывать уровень блокировки где-либо рядом с ним?

Я постараюсь связаться с сетевыми администраторами на работе и надеюсь, что у них есть решение, чтобы моя программа больше не блокировалась, но я все еще задаюсь вопросом, что может так сильно изменить Firefox и мою программу.


заранее спасибо

1 ответ

Решение

Хорошо, ответ настолько прост, насколько это возможно...

Firefox был настроен на использование автоматически настроенного прокси-сервера, поэтому вот что я сделал:

У меня были открыты мои сайты в Firefox, сделал netstat -an | find "EST" уловка, выяснил, что адрес прокси (и порт) и заставил мою программу использовать их со строками

System.setProperty("http.proxyHost", proxyAddress);а такжеSystem.setProperty("http.proxyPort", "8080");

Это решило проблему для меня...

Спасибо, jtahlborn за этот совет!

Редактировать:

Использование ProxySelector также работает довольно хорошо; если вам это нужно, перейдите по этой ссылке: http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

Другие вопросы по тегам