使用套接字来获取带有java的网页

时间:2011-09-21 13:12:08

标签: java http sockets

我想获取一个网页,只需获取数据(不解析或渲染任何内容),只需捕获http请求后返回的数据。

我正在尝试使用JavaRuntime Library的高级Class Socket 来完成此任务。

我想知道这是否可行,因为我不能轻易找出用于这种两点通信的底层,或者我不知道问题是否来自我自己的系统。

以下是我的代码正在做的事情:

1)设置套接字。

this.socket = new Socket( "www.example.com", 80 );

2)设置用于此通信的相应流。

this.out = new PrintWriter( socket.getOutputStream(), true);
this.in = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );

3)请求页面(这是我不确定这样做的地方)。

String query = "";
query += "GET / HTTP/1.1\r\n";
query += "Host: www.example.com\r\n";
...
query += "\r\n";

this.out.print(query);

4)读取结果(在我的情况下没有任何内容)。

System.out.print( this.in.readLine() );

5)关闭套接字和流。

5 个答案:

答案 0 :(得分:4)

如果您使用的是* nix系统,请查看CURL,它允许您使用命令行从互联网上检索信息。比Java套接字连接更轻量级。

如果您想使用Java,并且只是从网页检索信息,请查看Java URL库(java.net.URL)。一些示例Java代码:

URL ur = new URL("www.google.com");
URLConnection conn = ur.openConnection();
InputStream is = conn.getInputStream();
String foo = new Scanner(is).useDelimiter("\\A").next();
System.out.println(foo);

这将获取指定的URL,获取数据(在本例中为html)并将其吐出到控制台。可能必须调整分隔符abit,但这将适用于发送数据的大多数网络端点。

答案 1 :(得分:2)

您的代码看起来非常接近。您的GET请求可能会以某种方式出现格式错误。试试这个:打开一个telnet客户端并连接到一个Web服务器。粘贴在GET请求中,因为您认为它应该有效。看看是否会返回任何内容。如果不是,则意味着GET请求存在问题。最简单的方法是编写一个监听套接字的程序(或多或少与你正在做的相反)并将Web浏览器指向localhost:[正确端口]并查看Web浏览器发送给你的内容。将其用作GET请求的模板。

或者,您可以尝试从HTTP规范中将其拼凑在一起。

答案 2 :(得分:1)

我必须将完整的URL添加到GET参数。使它工作。虽然我看到你也可以指定HOST。

Socket socket = new Socket("youtube.com",80); 

PrintWriter out = new PrintWriter(new BufferedWriter(new 
OutputStreamWriter(socket.getOutputStream()))); 
out.println("GET http://www.youtube.com/yts/img/favicon_48-vflVjB_Qk.png 
HTTP/1.0"); 

out.println(); 
out.flush(); 

答案 3 :(得分:0)

是的,有可能。你只需要弄清楚协议。你很亲密。

我会创建一个简单的服务器套接字,打印出它的内容。然后,您可以使用您的浏览器使用以下网址连接到套接字:http://localhost:8080。然后使用客户端套接字模拟浏览器中的HTTP协议。

答案 4 :(得分:0)

不确定为什么你要低于URLConnection - 它的目的是做你想做的事:http://download.oracle.com/javase/tutorial/networking/urls/readingWriting.html

套接字上的Java Tutorial甚至说:“URL和URLConnections提供了一种相对高级别的机制来访问Internet上的资源。有时您的程序需要较低级别的网络通信,例如,当您要写入时客户端 - 服务器应用程序。“由于你不会低于HTTP,我不确定使用Socket是什么意思。