2014-11-02 132 views
0

我想讀這個URL的文本的第二行:「http://vuln2014.picoctf.com:51818/」(這是一個捕獲的旗幟競賽,但只要求旗幟或方向標誌打破競爭規則)。我試圖從URL打開一個輸入流,但我得到一個無效的HTTP響應異常。任何幫助表示讚賞,並且我認識到我的錯誤可能很愚蠢。如何使用Java從互聯網上讀取文本文件?

代碼:

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

在第三行中出現的錯誤。 java.io.IOException的:在name.main在sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1342)無效的HTTP響應(name.java:41)

捲曲愉快地得到來自頁面的文本,並且可以從Web瀏覽器完全訪問。

+0

stacktrace說什麼? – 2014-11-02 02:46:26

+0

2個小時前你不是隻問這個問題嗎? – 2014-11-02 02:47:00

+0

@HovercraftFullOfEels:同樣的問題被問到,除了沒有代碼(最初) – 2014-11-02 02:51:42

回答

2

當你這樣做:

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

你正在進入,表明此URL使用http協議的合同。當您撥打openConnection時,由於您在URL中使用http://作爲協議,因此預計會得到http響應。該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

歡迎代達羅斯公司間諜RSA密鑰生成服務。下面是您應該用來發送更新的公共模數。請記住,使用指數65537 b4ab920c4772c5247e7d89ec7570af7295f92e3b584fc1a1a5624d19ca07cd72ab4ab9c8ec58a63c09f382aa319fa5a714a46ffafcb6529026bbc058fc49fb1c29ae9f414db4aa609a5cab6ff5c7b4c4cfc7c18844f048e3899934999510b2fe25fcf8c572514dd2e14c6e19c4668d9ad82fe647cf9e700dcf6dc23496be30bb

在這種情況下,我會用java.net.Socket建立連接,然後讀線。這是一個簡單的方法,假設有兩行數據:

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

至於爲什麼curl和瀏覽器可以正確渲染它?他們可能會對他們讀取的數據更爲寬鬆,並且只會轉儲從端口讀取的內容,即使它不符合指定的協議(如http

+0

我很感激幫助。正如我懷疑的那樣,我是個傻瓜。 – 2014-11-02 04:19:23

+0

@JohnDrake你不是一個傻瓜,從錯誤中可以看出問題並不明顯。 – 2014-11-02 04:48:23

+1

@JohnDrake:你只是一個傻瓜,如果你忘了upvote和[接受](http://stackoverflow.com/help/someone-answers)這個答案,因爲它幫助你。最好的方式感謝邁克爾的努力。我也是1+。 – 2014-11-02 14:25:38