HTTP 请求充满垃圾

HTTP request is full of junk

我一直在 java 开发简单的 http 服务器。当我尝试通过 google 发送一些 http 请求时 浏览器“行”变量应该有请求字符串,但它有垃圾字符。
你知道是什么导致了这个问题吗?
代码来自本教程:https://www.youtube.com/watch?v=FqufxoA4m70&t=2061s&ab_channel=BloomInstituteofTechnology

这是您可以找到此问题的部分代码。

package com.company;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Main
{
    public static void main(String[] args) throws Exception
    {
        try( ServerSocket socketServer = new ServerSocket(8080))
        {
            System.out.println("Server created");
            while (true)
            {

                try (Socket client = socketServer.accept())
                {
                    System.out.println("Client connected: " + client.toString());
                    InputStreamReader isr = new InputStreamReader(client.getInputStream());
                    BufferedReader br = new BufferedReader(isr);
                    StringBuilder request = new StringBuilder();


                    String line;
                    line = br.readLine();
                    while(!line.isBlank())
                    {
                        request.append(line);
                        line = br.readLine();
                    }
                }
            }
        }


    }

我不知道您实际上在用浏览器做什么。您在 URL 栏中输入什么?如果您尝试使用 https 而不是 http,它将不起作用。也许“google 浏览器”在欺骗您并在您背后做事...不完全是发送简单的 HTTP 请求。

这行得通。它并不完美,但至少所有 IO 流都已正确关闭,并且向客户端发送了一个虚拟响应(否则将保持挂起状态)。

在浏览器中输入 http://localhost:8080/some-random-url 试试看。 我无法尝试使用 chrome,因为我不使用它,但这适用于 Firefox。通常,我会用 curl 而不是浏览器来测试这样的东西 - 在测试简单的东西时你有更多的控制权。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Main {

    public static void main(String[] args) throws Exception {
        try (ServerSocket socketServer = new ServerSocket(8080)) {
            System.out.println("Server created");
            while (true) {

                try (Socket client = socketServer.accept()) {
                    System.out.println("Client connected: " + client.toString());
                    try (final InputStream is = client.getInputStream();
                         final InputStreamReader isr = new InputStreamReader(is);
                         final BufferedReader br = new BufferedReader(isr);
                         final OutputStream os = client.getOutputStream()) {

                        final StringBuilder request = new StringBuilder();
                        String line;
                        while (!(line = br.readLine()).isBlank()) {
                            request.append(line).append("\n");
                        }

                        System.out.println("+++++++++++++++++++++++ REQUEST ");
                        System.out.println(request);

                        String response = "HTTP/1.1 200 OK\r\n" +
                                "Content-Type: text/plain\r\n" +
                                "Connection: closed\r\n" +
                                "\r\n" +
                                "Hello there!\r\n";

                        os.write(response.getBytes(StandardCharsets.UTF_8));
                        os.flush();
                        System.out.println("----------------------- RESPONSE ");
                        System.out.println(response);
                    }
                }
            }
        }
    }
}

随笔:不要自己实现 HTTP 服务器。只是为了了解它是如何工作的。