2014-11-02 2 views
0

Я хочу прочитать вторую строку текста по этому URL-адресу: «http://vuln2014.picoctf.com:51818/» (это соревнование по захвату флага, но только запрос флагов или направление к флагам нарушает правила соревнований). Я пытаюсь открыть поток ввода из URL-адреса, но получаю исключение Invalid HTTP Response. Любая помощь приветствуется, и я понимаю, что моя ошибка, скорее всего, довольно глупа.Как читать текстовый файл из Интернета с помощью Java?

Код:

URL url = new URL("http://vuln2014.picoctf.com:51818"); 
URLConnection con = url.openConnection(); 
InputStream is = con.getInputStream() 

Ошибка возникает в третьей строке. java.io.IOException: Неверный ответ Http на sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:1342) в name.main (name.java:41)

локон счастливо получает текст со страницы, и он отлично доступен из веб-браузера.

+0

Что говорит stacktrace? –

+0

Разве вы не задали этот же вопрос не 2 часа назад? –

+0

@HovercraftFullOfEels: тот же вопрос был задан, за исключением того, что с ним не было никакого кода (изначально) –

ответ

2

Когда вы сделаете это:

URL url = new URL("http://vuln2014.picoctf.com:51818"); 
URLConnection con = url.openConnection(); 

Вы заключаете контракт, который говорит, что этот URL использует протокол http. Когда вы вызываете openConnection, он ожидает получить ответы http, потому что вы использовали http:// в URL как протокол. Java Documentation говорит:

Если по протоколу URL (например, если HTTP или JAR), существует публичный, специализированный URLConnection подкласс, принадлежащий к одному из следующих пакетов или одного из их подпакетов: java.lang, Java. io, java.util, java.net, будет возвращено соединение этого подкласса. Например, для HTTP возвращается HttpURLConnection, а для JAR возвращается JarURLConnection.

Сервер, к которому вы подключаетесь, просто возвращает пару строк данных. Я получил их с помощью команды nc vuln2014.picoctf.com 51818. Там нет кода http ответа какHTTP/1.1 200 OK:

Добро пожаловать в Дедала Corp Spies RSA Service Generation Key. Публичный модуль, который вы должны использовать для отправки обновлений, приведен ниже. Не забывайте использовать показатель 65537. b4ab920c4772c5247e7d89ec7570af7295f92e3b584fc1a1a5624d19ca07cd72ab4ab9c8ec58a63c09f382aa319fa5a714a46ffafcb6529026bbc058fc49fb1c29ae9f414db4aa609a5cab6ff5c7b4c4cfc7c18844f048e3899934999510b2fe25fcf8c572514dd2e14c6e19c4668d9ad82fe647cf9e700dcf6dc23496be30bb

В этом случае я хотел бы использовать java.net.Socket установить соединение, а затем прочитать строки. Это упрощенный подход, который предполагает, что есть 2 строки данных:

Socket theSocket; 
try { 
    theSocket = new Socket("vuln2014.picoctf.com", 51818); 
    BufferedReader inFile = new BufferedReader(new InputStreamReader(theSocket.getInputStream())); 

    String strGreet = inFile.readLine(); 
    String strData = inFile.readLine(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

А почему скручиваются и браузеры могут сделать это правильно? Они, вероятно, более снисходительны в отношении данных, которые они читают, и просто сбрасывают то, что считывается из порта, даже если оно не соответствует указанному протоколу (например, http)

+0

Я ценю помощь. Я, как я подозревал, дурак. –

+0

@JohnDrake Ты не дурак, это не мучительно очевидно из-за ошибки, в чем проблема. –

+1

@JohnDrake: Ты только глупец, если забываешь о том, чтобы запереть и [принять] (http://stackoverflow.com/help/someone-answers) этот ответ, так как он вам помог. Лучший способ поблагодарить Майкла за его усилия. 1+ от меня тоже. –

Смежные вопросы