【问题标题】:New socket messed up by slashes?新的套接字被斜线弄乱了?
【发布时间】:2017-02-23 11:27:22
【问题描述】:

我有一个 Java 程序试图通过套接字发出 HTTP 请求。出于某种原因,字符串中的斜线搞砸了。

我有一个 try/catch,一旦使用带有斜杠的字符串创建套接字,它就会被捕获。

        Socket socket = new Socket("www.google.ca", port);

回应

HTTP/1.1 400 Bad Request
Content-Length: 54
Content-Type: text/html; charset=UTF-8
Date: Fri, 14 Oct 2016 06:05:43 GMT
Connection: close

<html><title>Error 400 (Bad Request)!!1</title></html>

现在用斜线

        Socket socket = new Socket("www.google.ca/", port);

被抓住了。

我的请求。

            outputStream.println("GET / HTTP/1.1");
            outputStream.println("");
            outputStream.flush();

我正在尝试使用带有斜杠的主机名和路径访问特定站点。发生了什么?

【问题讨论】:

  • 因为www.google.ca/ 不是有效的主机名。 url 的路径应该位于GET 部分。阅读有关 HTTP 协议的信息。如果你想连接到http://host/path,你应该打开一个到host的TCP套接字,然后使用GET /path等。

标签: java sockets slash


【解决方案1】:

IOException 更具体地说,您将获得UnknownHostExceptionIOException 的子类),因为主机名不能包含斜杠。

您应该在 catch 块中打印/记录异常的堆栈跟踪;这个问题会更加明显。

【讨论】:

  • 抱歉,那我该如何发出正确的http请求呢?到我正在寻找的路径。不使用 URL Connection 就不可能找到这方面的信息。
  • 不知道,因为您没有展示如何构建 http 请求。我只是用斜线回答为什么它会立即失败。
  • 我所拥有的 outputStream.println 就是我所拥有的。我传递了一个像 www.google.com/docs/about.html 这样的常规 URL 作为参数。
【解决方案2】:

第一个错误HTTP/1.1 400 Bad Request 是由于错误的请求路径而发生的。不知道你的代码很难找到原因。

第二个错误就像安迪·特纳所说的那样发生,因为主机名错误。 InetAddress 无法解析带有斜杠的主机名。

这个例子对我有用:

public static void main(String[] args) throws Exception {
    Socket s = new Socket(InetAddress.getByName("google.com"), 80);
    PrintWriter pw = new PrintWriter(s.getOutputStream());
    pw.println("GET /about/ HTTP/1.1"); // here comes the path
    pw.println("f-Modified-Since: Wed, 1 Oct 2017 07:00:00 GMT");
    pw.println("");
    pw.flush();
    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    String line;
    while((line = br.readLine()) != null){
        System.out.println(line);
    }
    br.close();
}

你只需要在这一行设置路径:

pw.println("GET /about HTTP/1.1");

【讨论】:

  • 好吧,有道理。好吧,对于我正在处理的任务,我确信我的教授会为此启用他的页面。所以。谁能指出我如何发送正确的 HTTP 请求,而不使用 URL 连接,更新我假设的标头?
  • 奖励积分...有条件的获取请求?说出“上次修改”时间。
  • Last Modified 来自响应头。
  • 检查。谢谢!这样就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多