1. 程式人生 > >使用Java實現簡單的Http伺服器

使用Java實現簡單的Http伺服器

在Java中可以使用HttpServer類來實現Http伺服器,該類位於com.sun.net包下(rt.jar)。實現程式碼如下:

主程式類

package bg.httpserver;

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

public class HttpServerStarter {
    public static void main(String[] args) throws IOException {
        //建立一個HttpServer例項,並繫結到指定的IP地址和埠號
        HttpServer httpServer = HttpServer.create(new InetSocketAddress(8080), 0);

        //建立一個HttpContext,將路徑為/myserver請求對映到MyHttpHandler處理器
        httpServer.createContext("/myserver", new MyHttpHandler());

        //設定伺服器的執行緒池物件
        httpServer.setExecutor(Executors.newFixedThreadPool(10));

        //啟動伺服器
        httpServer.start();
    }
}

HttpServer:HttpServer主要是通過帶參的create方法來建立,第一個引數InetSocketAddress表示繫結的ip地址和埠號。第二個引數為int型別,表示允許排隊的最大TCP連線數,如果該值小於或等於零,則使用系統預設值。

createContext:可以呼叫多次,表示將指定的url路徑繫結到指定的HttpHandler處理器物件上,伺服器接收到的所有路徑請求都將通過呼叫給定的處理程式物件來處理。

setExecutor:設定伺服器的執行緒池物件,不設定或者設為null則表示使用start方法建立的執行緒。

HttpHandler實現

package bg.httpserver;

import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 處理/myserver路徑請求的處理器類
 */
public class MyHttpHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange httpExchange) {
        try {
            StringBuilder responseText = new StringBuilder();
            responseText.append("請求方法:").append(httpExchange.getRequestMethod()).append("<br/>");
            responseText.append("請求引數:").append(getRequestParam(httpExchange)).append("<br/>");
            responseText.append("請求頭:<br/>").append(getRequestHeader(httpExchange));
            handleResponse(httpExchange, responseText.toString());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * 獲取請求頭
     * @param httpExchange
     * @return
     */
    private String getRequestHeader(HttpExchange httpExchange) {
        Headers headers = httpExchange.getRequestHeaders();
        return headers.entrySet().stream()
                                .map((Map.Entry<String, List<String>> entry) -> entry.getKey() + ":" + entry.getValue().toString())
                                .collect(Collectors.joining("<br/>"));
    }

    /**
     * 獲取請求引數
     * @param httpExchange
     * @return
     * @throws Exception
     */
    private String getRequestParam(HttpExchange httpExchange) throws Exception {
        String paramStr = "";

        if (httpExchange.getRequestMethod().equals("GET")) {
            //GET請求讀queryString
            paramStr = httpExchange.getRequestURI().getQuery();
        } else {
            //非GET請求讀請求體
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpExchange.getRequestBody(), "utf-8"));
            StringBuilder requestBodyContent = new StringBuilder();
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
                requestBodyContent.append(line);
            }
            paramStr = requestBodyContent.toString();
        }

        return paramStr;
    }

    /**
     * 處理響應
     * @param httpExchange
     * @param responsetext
     * @throws Exception
     */
    private void handleResponse(HttpExchange httpExchange, String responsetext) throws Exception {
        //生成html
        StringBuilder responseContent = new StringBuilder();
        responseContent.append("<html>")
                .append("<body>")
                .append(responsetext)
                .append("</body>")
                .append("</html>");
        String responseContentStr = responseContent.toString();
        byte[] responseContentByte = responseContentStr.getBytes("utf-8");

        //設定響應頭,必須在sendResponseHeaders方法之前設定!
        httpExchange.getResponseHeaders().add("Content-Type:", "text/html;charset=utf-8");

        //設定響應碼和響應體長度,必須在getResponseBody方法之前呼叫!
        httpExchange.sendResponseHeaders(200, responseContentByte.length);

        OutputStream out = httpExchange.getResponseBody();
        out.write(responseContentByte);
        out.flush();
        out.close();
    }
}

HttpExchange:用於獲取請求內容以及生成和傳送響應。

執行HttpServerStarter,在瀏覽器中訪問如下:

相關推薦

基於Java實現簡單Http伺服器之一

        本文將詳細介紹如何基於java語言實現一個簡單的Http伺服器,文中將主要介紹三個方面的內容:1)Http協議的基本知識、2)java.net.Socket類、3)java.net.ServerSocket類,讀完本文後你可以把這個伺服器用多執行緒的技術重新編

JAVA實現簡易HTTP伺服器

說實話,之前完全沒有想過,我還能寫出伺服器。感覺伺服器這麼高階的東西,能會用就不錯了,還能寫。 不吐槽了,開始了。 這次的作業是搭建一個伺服器,要能接收請求,並給瀏覽器返回正確響應。 專案的下載地址 專案目標:實現一個簡易的多執行

實現簡單HTTP伺服器-圖片與CGI

簡介 在學習了深入理解作業系統第11章的內容後,更加深刻的理解的Socket,IO流,fork,Cgi 以及Http等知識。並且學習了HTTP伺服器的程式碼實現。並不複雜,大概300行,就可以實現傳送圖片,和執行CGI程式將結果返回給客戶端。 具體實現過

c++實現簡單http伺服器

http基於tcp協議的應用層協議,說白了就是寫死的自定義協議,程式碼實現了簡單的get請求,開啟服務後,可以通過網站訪問本地資源,適合新手學習的簡單程式碼,有助於理解get和http報文,很簡單 HttpService.h#ifndef HTTP_SERVICE #def

使用Java實現簡單Http伺服器

在Java中可以使用HttpServer類來實現Http伺服器,該類位於com.sun.net包下(rt.jar)。實現程式碼如下: 主程式類 package bg.httpserver; import com.sun.net.httpserver.HttpServer; import java.io.IO

簡單HTTP伺服器實現

   我們這裡實現一個簡單的HTTP伺服器,無論瀏覽器向我們請求什麼資料,我們都返回一個hello world    //實現最簡單的http服務端程式 //返回hello world //http是應用協議,在傳輸層使用的是tcp協議所

Netty實現簡單HTTP代理伺服器

自上次使用Openresty+Lua+Nginx的來加速自己的網站,用上了比較時髦的技術,感覺算是讓自己的網站響應速度達到極限了,直到看到了Netty,公司就是打算用Netty來替代Openresty這一套,所以,自己也學了好久,琢磨了好一趟才知道怎麼用,現在用來寫一套HTTP代理伺服器吧,之後再測試一下效能

Socket+執行緒池實現簡單http單檔案伺服器

import java.io.*; import java.net.*; import java.nio.charset.Charset; import java.nio.file.*; import java.util.concurrent.*; impor

使用poco庫搭建簡單http伺服器實現hello world

原始碼例子如下: #include "Poco/Net/HTTPServer.h" #include "Poco/Net/HTTPRequestHandler.h" #include "Poco/Net/HTTPRequestHandlerFactory.h" #incl

Windows 上靜態編譯 Libevent 2.0.10 並實現一個簡單 HTTP 伺服器

      假設 Visual Studio 2005 的安裝路徑為“D:\Program Files\Microsoft Visual Studio 8\”,Libevent 2.0.10 解壓後的路徑為“D:\libevent-2.0.10-stable”。 編譯生成L

Java實現簡單的Socket伺服器與客戶端字串通訊(適合初學者閱讀)

       近段時間,頻繁看到很多學生做畢業設計用到了Socket通訊技術,問題非常多,特寫一個小例子,希望對馬上畢業的同學有所幫助。如果希望學習的更加深入,需要掌握的知識有:面向物件、多執行緒、Socket通訊、IO流、異常處理 伺服器端程式碼: import java

Android與Java NIO實現簡單Echo伺服器與客戶端

上一篇用Java IO來做了個Demo,於是乎進一步,用Java NIO來做一個。NIO的優勢在於非阻塞。使用了Selector在一個執行緒裡進行輪詢,就能夠完成接入、收\發訊息的操作,不需要每建立一個連線都新啟動一個執行緒的方式。Server端程式碼:public clas

Java實現簡單的FTP伺服器

前言 學習了Java網路程式設計了,為了檢驗自己的學習程式和熟悉相關的知識點,為此,使用Java Socket程式設計實現了一個簡單的FTP伺服器。以下記錄了自己整個開發的流程。 FTP協議 自己平時也有用過ftp協議進行檔案的傳輸,知道FT

Java編寫你自己的簡單HTTP伺服器

HTTP是個大協議,完整功能的HTTP伺服器必須響應資源請求,將URL轉換為本地系統的資源名。響應各種形式的HTTP請求(GET、POST等)。處理不存在的檔案請求,返回各種形式的狀態碼,解析MIME型別等。但許多特定功能的HTTP伺服器並不需要所有這些功能。例如,很多網站只

Java實現簡單的檔案上傳伺服器和客戶端

/** * 使用TCP協議實現上傳功能的伺服器端 * 思路: * 新建ServerSocket * 等待客戶端連線 * 連線上後開啟子執行緒,把連接獲取的Socket傳給子執行緒 * 迴圈進行 * @author yajun * */ public class UploadServer {

java實現簡單的四則運算

四則運算 計算器本文出自 “十裏稻花香” 博客,請務必保留此出處http://5880861.blog.51cto.com/5870861/1943836java實現簡單的四則運算

java實現簡單二維迷宮(2)

blog 成員 new 構建 push port ava amp use 這次是改良版本。 將地圖封裝,老鼠封裝。是對Java基礎的一個練習吧。 這次實現也遇到了一些問題。主要是棧。封裝的mouse類中有成員變量i,j代表了老鼠的坐標。將mouse類對象m入棧的時候,總是入

Java實現簡單文件過濾器

想要 空格 遞歸 port 文件過濾 list rgs lis http 輸入路徑查找該路徑下的指定文件類型的文件 代碼思路: 想要循環遍歷文件夾下所有子文件夾,就要用到遞歸。 首先判斷路徑是否存在:   是:獲取文件     判斷是否文件夾:       是:調用自身

java實現簡單的單點登錄 (轉)

hresult 調查公司 exe ftp 說我 負數 是我 create 統一 摘要:單點登錄(SSO)的技術被越來越廣泛地運用到各個領域的軟件系統當中。本文從業務的角度分析了單點登錄的需求和應用領域;從技術本身的角度分析了單點登錄技術的內部機制和實現手段,並且給出Web-

java 實現簡單的短信發送

下載 har ase 設置 request enc value pri ring 現在中國網建上註冊一個自己的賬戶, 然後裏面有代碼案例,也有相應的下載jar包的地址 代碼如下: public class Message { public static void main