我想获取一个网页,只需获取数据(不解析或渲染任何内容),只需捕获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)关闭套接字和流。
答案 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是什么意思。