首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Socket 測試 HTTP 協議遇到 505 錯誤的排查與修正

     編輯:Java 相關知識

問題場景

使用原始 Socket 發送 HTTP 請求獲取網頁源碼,代碼如下:

Socket s = new Socket("127.0.0.1", 8084);
PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
pw.println("GET / HTTTP/1.1");
pw.println("Host:PC2014040911DWA");
pw.println("Content-Type:text/html");
pw.println();
pw.flush();
// 讀取響應...

Tomcat 8084 端口正常運行,瀏覽器訪問無誤,但程序返回 HTTP 505 錯誤:

505 錯誤響應

錯誤分析

HTTP 505 表示「HTTP 版本不受支持」。仔細檢查請求行:

GET / HTTTP/1.1

發現拼寫錯誤:HTTTP 多了一個 T,導致服務器無法識別協議版本。此外,HTTP/1.1 要求必须包含 Host 頭,但格式應為 Host: hostname(冒號後有空格),且請求行結尾應為 HTTP/1.1 而非自定義字符串。

修正方案

簡化請求至 HTTP/1.0 風格(不強制要求 Host 頭),或修正 HTTP/1.1 請求格式。經測試,移除版本號直接發送 GET / 即可成功:

Socket s = new Socket("127.0.0.1", 8080);
PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
pw.println("GET /");
pw.println("Host: PC2014040911DWA");
pw.println("Content-Type: text/html");
pw.println();
pw.flush();
// 讀取響應...

響應正常返回:

正常響應

頁面內容

關鍵點總結

  1. HTTP 請求行格式嚴格:METHOD PATH HTTP/VERSION,版本號拼寫必須準確
  2. HTTP/1.1 必須包含 Host 頭,格式 Host: <hostname>
  3. 請求頭與空行結尾 \r\n 規範,PrintWriter 默認 \n 可能導致部分服務器解析異常,建議手動發送 \r\n
  4. 測試時優先使用成熟 HTTP 客戶端庫,避免手工拼裝協議細節
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved