我一直在用 java 開發簡單的 http 服務器。當我嘗試通過谷歌瀏覽器發送一些 http 請求時,“line”變數應該有請求字串,但它有垃圾字符。
你知道是什么導致了這個問題嗎?
代碼來自本教程: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();
}
}
}
}
}
uj5u.com熱心網友回復:
我不知道你實際上在用瀏覽器做什么。你在 URL 欄中輸入什么?如果您嘗試使用 https 而不是 http,它將不起作用。也許“谷歌瀏覽器”在欺騙你并在你背后做事......不完全是發送簡單的 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服務器。只是為了了解它是如何作業的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/393814.html
