【问题标题】:SimpleClient - GET requestSimpleClient - 获取请求
【发布时间】:2014-04-21 15:28:29
【问题描述】:

我在我的学校得到了这个培训任务,它说:在“SimpleClient”中进行更改,以便它向命令行上给出的地址发出 GET 请求,并将响应的内容存储到磁盘上的文件中。

import java.net.*;
import java.io.*;

public class SimpleClient {
  public static void main(String[] args) {
    try {
      Socket con = new Socket(args[0], Integer.parseInt(args[1]));

      PrintStream out = new PrintStream(con.getOutputStream());
      out.print(args[2]);
      out.write(0); // mark end of message
      out.flush();

      InputStreamReader in = new InputStreamReader(con.getInputStream());
      int c;
      while ((c = in.read())!=-1)
        System.out.print((char)c);

      con.close();
    } catch (IOException e) {
      System.err.println(e); 
    }
  }
}

据我所知,Socket 的“con”实例应该通过端口号(args[1])与主机(args[0] 例如 www.google.com)建立连接。然后就做了一个PrintStream“out”,但是out.print(args[2])和out.write(0)的作用是什么?我不完全了解该程序,因此如果有人可以向我解释它并告诉我应该更改哪些内容以使其正常工作,我将不胜感激。

【问题讨论】:

    标签: java http request httprequest


    【解决方案1】:

    打开套接字连接与触发 GET 请求不同。看看Using java.net.URLConnection to fire and handle HTTP requests

    【讨论】:

    • 谢谢!但是上面的代码只是我得到的任务的复制粘贴。那么,如果他们使用了错误的连接类型,这并不奇怪吗?
    • 这是一项奇怪的任务,但 HTTP 连接确实以套接字连接开始。正是您发送的内容(通过out.print(...))以及您如何处理响应(通过in.read() 接收)来制定协议(如HTTP)。可以通过这种方式发送 HTTP get-request(并接收响应),但通常不是这样。
    【解决方案2】:

    好的,如果有人感兴趣,我找到了解决方案。

    import java.net.*;
    import java.io.*;
    
    public class SimpleClient {
        public static void main(String[] args) {
            try {
                FileWriter fw = new FileWriter(args[args.length - 1]);
    
                BufferedWriter bw = new BufferedWriter(fw);
                try {
                    Socket con = new Socket(args[0], Integer.parseInt(args[1]));
    
                    PrintStream out = new PrintStream(con.getOutputStream());
                    out.println("GET /search?q=" + args[2] + " HTTP/1.1");
                    out.println("Host: www.google.com");
                    out.println("");
                    out.write(0); // mark end of message
                    out.flush();
    
                    InputStreamReader in = new InputStreamReader(
                            con.getInputStream());
                    int c;
                    while ((c = in.read()) != -1)
                        bw.write((char) c);    
                    con.close();
                } catch (IOException e) {
                    System.err.println(e);
                }
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 2019-08-10
      • 2018-01-09
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 2016-03-14
      • 2016-02-16
      相关资源
      最近更新 更多