2015-08-19 49 views
3

我正在写一个简单的程序发送获取请求到一个特定的URL“http://badunetworks.com/about/”。如果我将它发送到“http://badunetworks.com”,但是我需要将它发送到关于页面,请求才有效。GET请求与Java套接字

package badunetworks; 
import java.io.*; 
import java.net.*; 

public class GetRequest { 


    public static void main(String[] args) throws Exception { 

     GetRequest getReq = new GetRequest(); 

     //Runs SendReq passing in the url and port from the command line 
     getReq.SendReq("www.badunetworks.com/about/", 80); 


    } 

    public void SendReq(String url, int port) throws Exception { 

     //Instantiate a new socket 
     Socket s = new Socket("www.badunetworks.com/about/", port); 

     //Instantiates a new PrintWriter passing in the sockets output stream 
     PrintWriter wtr = new PrintWriter(s.getOutputStream()); 

     //Prints the request string to the output stream 
     wtr.println("GET/HTTP/1.1"); 
     wtr.println("Host: www.badunetworks.com"); 
     wtr.println(""); 
     wtr.flush(); 

     //Creates a BufferedReader that contains the server response 
     BufferedReader bufRead = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     String outStr; 

     //Prints each line of the response 
     while((outStr = bufRead.readLine()) != null){ 
      System.out.println(outStr); 
     } 


     //Closes out buffer and writer 
     bufRead.close(); 
     wtr.close(); 

    } 

} 
+0

您是否有任何错误输出? –

回答

2

如果有关网页链接about.html,那么你必须改变这一行wtr.println( “GET/HTTP/1.1”)到WTR。 println(“GET /about.html HTTP/1.1”)。

插座创作

删除/约

wtr.println( “GET/HTTP/1.1”); --->这行叫你指定的主机的主页。

1

您需要打开无法访问路径的网址的套接字。

Socket("www.badunetworks.com", port); 

并且在发送命令之后GET/{路径} HTTP/1.1例如

GET /about HTTP/1.1 

...其他头......

1

当您对网络服务器进行如此低级访问时,您应该了解7 OSI layers。套接字位于第5层,HTTP位于第7层。这也是为什么java.net.Socket只接受主机名或InetAddr而没有URL的原因。 到与套接字做到这一点,你必须正确地实现HTTP协议,即

  • 创建一个套接字连接主机端口,即www.badunetworks.com80
  • 发送HTTP数据包输出流包含,方法,资源路径和协议版本,即GET /about/ HTTP/1.1
  • 正确读取和解释响应(标题和正文)

但我不知道为什么你这样做这个复杂的,有很多的替代品,以实现低层次的HTTP客户端自己:

  • 好老java.net.URL,如不赞成其处理,它的仍然是阅读资源的最简单的方法之一,只需拨打openStream()读它
  • Apache HTTP Client是java的最广泛的HTTP客户端实现,这是比通过URL
  • 阅读很容易使用和更灵活的一个
  • javax.ws.rs has ag ood builder api创建web客户端
+0

Badu Networks正在招聘一名java编程实习生,在申请工作时你必须做的事情之一就是完成编程挑战。挑战在于只使用java套接字编程来执行GET请求。 – user3236794

+0

我提出了所有建议的更改,现在似乎可行。但是,我收到了一个404响应代码,因为在我将其输入到浏览器中时该路径起作用,这是很奇怪的。有任何想法吗? – user3236794