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 服务器。只是为了了解它是如何工作的。
我一直在 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 服务器。只是为了了解它是如何工作的。