如何使用Java从Internet读取文本文件?

时间:2014-11-02 02:45:31

标签: java stream

我想在这个URL读取文本的第二行:“http://vuln2014.picoctf.com:51818/”(这是一个捕获标志的竞争,但只是要求标志或标志的方向打破竞争规则)。我试图从URL打开输入流,但我得到一个无效的HTTP响应异常。任何帮助都表示赞赏,我认识到我的错误可能非常愚蠢。

代码:

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

错误发生在第三行。 java.io.IOException:sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1342)在name.main(name.java:41)上的无效Http响应

curl愉快地从页面获取文本,并且可以从Web浏览器中完全访问它。

1 个答案:

答案 0 :(得分:2)

执行此操作时:

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

您正在签订一份合同,声明此网址使用http协议。当您致电openConnection时,由于您在网址中使用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

  

欢迎来到Daedalus Corp间谍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