Java 为什么我会得到一个;无效请求“;使用套接字发送http请求时出错?

Java 为什么我会得到一个;无效请求“;使用套接字发送http请求时出错?,java,sockets,http,Java,Sockets,Http,我想用低级套接字发送一个http请求,然后解析结果,但是我不能得到正确的结果,控制台告诉我我的请求无效,有人能帮我找到问题吗?谢谢 这是我的密码: try { URL url = new URL(request.getUrl()); Socket socket = new Socket(InetAddress.getByName(url.getHost()), 80); PrintWriter pw = new PrintWriter(socket.getOutpu

我想用低级套接字发送一个http请求,然后解析结果,但是我不能得到正确的结果,控制台告诉我我的请求无效,有人能帮我找到问题吗?谢谢

这是我的密码:

try {
     URL url = new URL(request.getUrl());
     Socket socket = new Socket(InetAddress.getByName(url.getHost()), 80);
     PrintWriter pw = new PrintWriter(socket.getOutputStream());
     pw.print("GET / HTTP/1.1 \r\n");
     pw.print("Host: " + url.getHost() + "  \r\n");
     pw.print("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 \r\n");
     pw.print("Accept-Encoding: gzip, deflate \r\n");
     pw.print("Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4 \r\n");
     pw.print("Cache-Control: max-age=0 \r\n");
     pw.print("Connection: keep-alive \r\n");
     pw.print("Upgrade-Insecure-Requests: 1 \r\n");
     pw.print("User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36 \r\n");
     pw.println("\r\n");
     pw.flush();

     InputStream is = socket.getInputStream();
     BufferedReader read = new BufferedReader(new InputStreamReader(is));

     String line;
     while ((line = read.readLine()) != null) {
        buffer.append(line).append('\n');
     }
     System.out.println(buffer.toString());
     } catch (IOException e) {
           callback.onFailed(e.getMessage());
     }
我将url“”作为请求的成员,但控制台显示如下:

HTTP/1.0 400 Bad request
Cache-Control: no-cache
Connection: close
Content-Type: text/html

<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>
HTTP/1.0 400错误请求
缓存控制:没有缓存
连接:关闭
内容类型:text/html
400错误请求
您的浏览器发送了无效的请求。
关于我的请求头有什么问题吗?但我已经搜索了很多解决方案,例如添加“\r\n”,但它无法解决问题。
谢谢你的帮助

您的请求行格式不正确-缺少协议(以及标题和其他内容)

构造原始请求的原因是什么?对于简单请求,可以使用库(OkHttpClien、apachehttp客户端)或至少
HttpUrlConnection

无论如何,您都在使用
URL
,它具有类似于
openConnection()
的功能,可以满足您的需要


您的请求行格式不正确。发件人:

请求行=方法SP请求URI SP HTTP版本CRLF

在CRLF前面有一个空格。删除它可以修复问题(并给出302永久移动的结果)


如果要实现HTTP,您需要对RFC及其后续版本有很好的了解。我强烈建议您避免所有这些努力,只需使用
HttpURLConnection
。它已经完成。

首先,它应该是
\r
\n
,而不是
\\r
\\n
…并且
\r
\n
之间不应该有空格。您没有添加
“\r\n”
。您添加了四个字符
'
'\r'
'
'\n'
,这不是有效的换行符序列。删除这些中间的空格,您的请求将有效。谢谢您的回答!我只想尝试低级请求,我已经尝试像这样完成我的请求头:
pw.print(“GET/HTTP/1.1\r\n”);print(“主机:“+url.getHost()+”\r\n”);print(“接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n”);打印(“接受编码:gzip,deflate\r\n”);打印(“接受语言:zh CN,zh;q=0.8,en;q=0.6,zh TW;q=0.4\r\n”),但请求仍然是无效的请求。
pw.print("GET / HTTP/1.1 \r\n");