2014-11-02 136 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