關於JAVA的HTTP服務器的簡單實現,還望你們給出寶貴建議,謝謝。
一、首先來講下HTTP全部的狀態碼,相信對於網頁開發的博友們,確定不陌生。
狀態碼
|
狀態碼英文名稱
|
中文描述
|
---|---|---|
100
|
Continue
|
繼續。
客戶端應繼續其請求
|
101
|
Switching Protocols
|
切換協議。服務器根據客戶端的請求切換協議。只能切換到更高級的協議,例如,切換到HTTP的新版本協議
|
200
|
OK
|
請求成功。通常用於GET與POST請求
|
201
|
Created
|
已建立。成功請求並建立了新的資源
|
202
|
Accepted
|
已接受。已經接受請求,但未處理完成
|
203
|
Non-Authoritative Information
|
非受權信息。請求成功。但返回的meta信息不在原始的服務器,而是一個副本
|
204
|
No Content
|
無內容。服務器成功處理,但未返回內容。在未更新網頁的狀況下,可確保瀏覽器繼續顯示當前文檔
|
205
|
Reset Content
|
重置內容。服務器處理成功,用戶終端(例如:瀏覽器)應重置文檔視圖。可經過此返回碼清除瀏覽器的表單域
|
206
|
Partial Content
|
部份內容。服務器成功處理了部分GET請求
|
300
|
Multiple Choices
|
多種選擇。請求的資源可包括多個位置,相應可返回一個資源特徵與地址的列表用於用戶終端(例如:瀏覽器)選擇
|
301
|
Moved Permanently
|
永久移動。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI。從此任何新的請求都應使用新的URI代替
|
302
|
Found
|
臨時移動。與301相似。但資源只是臨時被移動。客戶端應繼續使用原有URI
|
303
|
See Other
|
查看其它地址。與301相似。使用GET和POST請求查看
|
304
|
Not Modified
|
未修改。所請求的資源未修改,服務器返回此狀態碼時,不會返回任何資源。客戶端一般會緩存訪問過的資源,經過提供一個頭信息指出客戶端但願只返回在指定日期以後修改的資源
|
305
|
Use Proxy
|
使用代理。所請求的資源必須經過代理訪問
|
306
|
Unused
|
已經被廢棄的HTTP狀態碼
|
307
|
Temporary Redirect
|
臨時重定向。與302相似。使用GET請求重定向
|
400
|
Bad Request
|
客戶端請求的語法錯誤,服務器沒法理解
|
401
|
Unauthorized
|
請求要求用戶的身份認證
|
402
|
Payment Required
|
保留,未來使用
|
403
|
Forbidden
|
服務器理解請求客戶端的請求,可是拒絕執行此請求
|
404
|
Not Found
|
服務器沒法根據客戶端的請求找到資源(網頁)。經過此代碼,網站設計人員可設置"您所請求的資源沒法找到"的個性頁面
|
405
|
Method Not Allowed
|
客戶端請求中的方法被禁止
|
406
|
Not Acceptable
|
服務器沒法根據客戶端請求的內容特性完成請求
|
407
|
Proxy Authentication Required
|
請求要求代理的身份認證,與401相似,但請求者應當使用代理進行受權
|
408
|
Request Time-out
|
服務器等待客戶端發送的請求時間過長,超時
|
409
|
Conflict
|
服務器完成客戶端的PUT請求時可能返回此代碼,服務器處理請求時發生了衝突
|
410
|
Gone
|
客戶端請求的資源已經不存在。410不一樣於404,若是資源之前有如今被永久刪除了可以使用410代碼,網站設計人員可經過301代碼指定資源的新位置
|
411
|
Length Required
|
服務器沒法處理客戶端發送的不帶Content-Length的請求信息
|
412
|
Precondition Failed
|
客戶端請求信息的先決條件錯誤
|
413
|
Request Entity Too Large
|
因爲請求的實體過大,服務器沒法處理,所以拒絕請求。爲防止客戶端的連續請求,服務器可能會關閉鏈接。若是隻是服務器暫時沒法處理,則會包含一個Retry-After的響應信息
|
414
|
Request-URI Too Large
|
請求的URI過長(URI一般爲網址),服務器沒法處理
|
415
|
Unsupported Media Type
|
服務器沒法處理請求附帶的媒體格式
|
416
|
Requested range not satisfiable
|
客戶端請求的範圍無效
|
417
|
Expectation Failed
|
服務器沒法知足Expect的請求頭信息
|
500
|
Internal Server Error
|
服務器內部錯誤,沒法完成請求
|
501
|
Not Implemented
|
服務器不支持請求的功能,沒法完成請求
|
502
|
Bad Gateway
|
充當網關或代理的服務器,從遠端服務器接收到了一個無效的請求
|
503
|
Service Unavailable
|
因爲超載或系統維護,服務器暫時的沒法處理客戶端的請求。延時的長度可包含在服務器的Retry-After頭信息中
|
504
|
Gateway Time-out
|
充當網關或代理的服務器,未及時從遠端服務器獲取請求
|
505
|
HTTP Version not supported
|
服務器不支持請求的HTTP協議的版本,沒法完成處理
|
二、其次,在講解一下關於HTTP響應頭:html
package demo.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class HTTPServer { public static void main(String[] args) { try { ServerSocket ss=new ServerSocket(8888); while(true){ Socket socket=ss.accept(); BufferedReader bd=new BufferedReader(new InputStreamReader(socket.getInputStream())); /** * 接受HTTP請求 */ String requestHeader; int contentLength=0; while((requestHeader=bd.readLine())!=null&&!requestHeader.isEmpty()){ System.out.println(requestHeader); /** * 得到GET參數 */ if(requestHeader.startsWith("GET")){ int begin = requestHeader.indexOf("/?")+2; int end = requestHeader.indexOf("HTTP/"); String condition=requestHeader.substring(begin, end); System.out.println("GET參數是:"+condition); } /** * 得到POST參數 * 1.獲取請求內容長度 */ if(requestHeader.startsWith("Content-Length")){ int begin=requestHeader.indexOf("Content-Lengh:")+"Content-Length:".length(); String postParamterLength=requestHeader.substring(begin).trim(); contentLength=Integer.parseInt(postParamterLength); System.out.println("POST參數長度是:"+Integer.parseInt(postParamterLength)); } } StringBuffer sb=new StringBuffer(); if(contentLength>0){ for (int i = 0; i < contentLength; i++) { sb.append((char)bd.read()); } System.out.println("POST參數是:"+sb.toString()); } //發送回執 PrintWriter pw=new PrintWriter(socket.getOutputStream()); pw.println("HTTP/1.1 200 OK"); pw.println("Content-type:text/html"); pw.println(); pw.println("<h1>訪問成功!</h1>"); pw.flush(); socket.close(); } } catch (IOException e) { e.printStackTrace(); } } }