1. 程式人生 > >一個簡易的java http伺服器

一個簡易的java http伺服器

TTP是個大協議,完整功能的HTTP伺服器必須響應資源請求,將URL轉換為本地系統的資源名。響應各種形式的HTTP請求(GET、POST等)。處理不存在的檔案請求,返回各種形式的狀態碼,解析MIME型別等。但許多特定功能的HTTP伺服器並不需要所有這些功能。例如,很多網站只是想顯示“建設中“的訊息。很顯然,Apache對於這樣的網站是大材小用了。這樣的網站完全可以使用只做一件事情的定製伺服器。Java網路類庫使得編寫這樣的單任務伺服器輕而易舉。

定製伺服器不只是用於小網站。大流量的網站如Yahoo,也使用定製伺服器,因為與一般用途的伺服器相比,只做一件事情的伺服器通常要快得多。針對某項任務來優化特殊用途的伺服器很容易;其結果往往比需要響應很多種請求的一般用途伺服器高效得多。例如,對於重複用於多頁面或大流量頁面中的圖示和圖片,用一個單獨的伺服器處理會更好(並且還可以避免在請求時攜帶不必要的Cookie,因而可以減少請求/響應資料,從而減少下載頻寬,提升速度);這個伺服器在啟動時把所有圖片檔案讀入記憶體,從RAM中直接提供這些檔案,而不是每次請求都從磁碟上讀取。此外,如果你不想在包含這些圖片的頁面請求之外單獨記錄這些圖片,這個單獨伺服器則會避免在日誌記錄上浪費時間。

本篇為大家簡要演示三種HTTP伺服器:

(1)     簡單的單檔案伺服器

(2)     重定向伺服器

(3)     完整功能的HTTP伺服器

簡單的單檔案伺服器

該伺服器的功能:無論接受到何種請求,都始終傳送同一個檔案。這個伺服器命名為SingleFileHTTPServer,檔名、本地埠和內容編碼方式從命令列讀取。如果預設埠,則假定埠號為80。如果預設編碼方式,則假定為ASCII。
[java] view plain copy  print?
  1. import java.io.*;  
  2. import
     java.net.ServerSocket;  
  3. import java.net.Socket;  
  4. publicclass SingleFileHTTPServer extends Thread {  
  5.     privatebyte[] content;  
  6.     privatebyte[] header;  
  7.     privateint port=80;  
  8.     private SingleFileHTTPServer(String data, String encoding,  
  9.                 String MIMEType, int port) 
    throws UnsupportedEncodingException {  
  10.         this(data.getBytes(encoding), encoding, MIMEType, port);  
  11.     }  
  12.     public SingleFileHTTPServer(byte[] data, String encoding, String MIMEType, int port)throws UnsupportedEncodingException {  
  13.         this.content=data;  
  14.         this.port=port;  
  15.         String header="HTTP/1.0 200 OK\r\n"+  
  16.             "Server: OneFile 1.0\r\n"+  
  17.             "Content-length: "+this.content.length+"\r\n"+  
  18.             "Content-type: "+MIMEType+"\r\n\r\n";  
  19.         this.header=header.getBytes("ASCII");  
  20.     }  
  21.     publicvoid run() {  
  22.         try {  
  23.             ServerSocket server=new ServerSocket(this.port);  
  24.             System.out.println("Accepting connections on port "+server.getLocalPort());  
  25.             System.out.println("Data to be sent:");  
  26.             System.out.write(this.content);  
  27.             while (true) {  
  28.                 Socket connection=null;  
  29.                 try {  
  30.                     connection=server.accept();  
  31.                     OutputStream out=new BufferedOutputStream(connection.getOutputStream());  
  32.                     InputStream in=new BufferedInputStream(connection.getInputStream());  
  33.                     StringBuffer request=new StringBuffer();  
  34.                     while (true) {  
  35.                         int c=in.read();  
  36.                         if (c=='\r'||c=='\n'||c==-1) {  
  37.                             break;  
  38.                         }  
  39.                         request.append((char)c);  
  40.                     }  
  41.                         //如果檢測到是HTTP/1.0及以後的協議,按照規範,需要傳送一個MIME首部
  42.                         if (request.toString().indexOf("HTTP/")!=-1) {  
  43.                             out.write(this.header);  
  44.                         }  
  45.                         out.write(this.content);  
  46.                         out.flush();  
  47.                 } catch (IOException e) {  
  48.                     // TODO: handle exception
  49.                 }finally{  
  50.                     if (connection!=null) {  
  51.                         connection.close();  
  52.                     }  
  53.                 }  
  54.             }  
  55.         } catch (IOException e) {  
  56.             System.err.println("Could not start server. Port Occupied");  
  57.         }  
  58.     }  
  59.     publicstaticvoid main(String[] args) {  
  60.         try {  
  61.             String contentType="text/plain";  
  62.             if (args[0].endsWith(".html")||args[0].endsWith(".htm")) {  
  63.                 contentType="text/html";  
  64.             }  
  65.             InputStream in=new FileInputStream(args[0]);  
  66.             ByteArrayOutputStream out=new ByteArrayOutputStream();  
  67.             int b;  
  68.             while ((b=in.read())!=-1) {  
  69.                 out.write(b);  
  70.             }  
  71.             byte[] data=out.toByteArray();  
  72.             //設定監聽埠
  73.             int port;  
  74.             try {  
  75.                 port=Integer.parseInt(args[1]);  
  76.                 if (port<1||port>65535) {  
  77.                     port=80;  
  78.                 }  
  79.             } catch (Exception e) {  
  80.                 port=80;  
  81.             }  
  82.             String encoding="ASCII";  
  83.             if (args.length>2) {  
  84. 相關推薦

    編寫一個簡易HTTP 伺服器程式

    好久沒輸出了,知識還是要寫下總結才能讓思路更加清晰。最近在學習計算機網路相關的知識,來聊聊如何編寫一個建議的HTTP伺服器。 HTTP 伺服器 HTTP伺服器,就是一個執行在主機上的程式。程式啟動了之後,會一直在等待其他所有客戶端的請求,接收到請求之後,處理請求,然

    一個簡易java http伺服器

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

    JAVA實現一個簡單地Http伺服器

    SimpleHttpServer.java import java.io.FileInputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.So

    python3 使用http.server模塊 搭建一個簡易http服務器

    test class ont elf resp his local and height from http.server import HTTPServer, BaseHTTPRequestHandler import json data = {‘result‘:

    在Android中實現一個簡易Http服務器

    .get json data ESS public 瀏覽器 顯示 getmethod blank 最近遇到一個需求需要在App中創建一個Http服務器供供瀏覽器調用,用了下開源的微型Htpp服務器框架:NanoHttpd,項目地址:https://github.com/Na

    Qt Http QHttpMultiPart上傳檔案到java http伺服器

                             Qt Http QHttpMultiPart上傳檔案到java http伺服器 1.最近專案用到了Qt上傳檔案到HT

    C實現的 簡易http伺服器

    #include <stdio.h> #include <ctype.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include &l

    Node -- 使用express框架搭建一個簡易本機伺服器(純手打)

    直接開擼,建立專案資料夾,在cmd中進入專案路徑或者直接在webstorm下點開Terminal,輸入命令 npm install nrm -g -g:全域性安裝  國內包對映庫,下載nrm的模組到專案中 nrm:切換映象地址的模組包 nrm-h:幫助 nrm ls:可以檢視所有

    使用Node.js建立一個簡單的HTTP伺服器

    1.建立一個名為test.js的檔案,內容為: // test.js // 請求http模組 var http = require('http'); // 建立伺服器 http.createServer(function (req, res) { res.writ

    python實現一個簡單的http伺服器

    1. HTTP伺服器的實現 實現一個http伺服器說白了就是實現一個監聽程式,當客戶端發來對應的http請求時,能夠解析請求,並且返回對應的資源給客戶端,客戶端解析顯示到瀏覽器上。這裡我使用python實現一個最簡單的http伺服器。 1.1初始化 定義一個初始化方法,建立套

    使用ffmpeg和nginx搭建一個簡易的HLS伺服器(2)-參考

    參考:http://idadu.org/wordpress/使用ffmpeg和nginx搭建一個簡易的hls伺服器/ 使用ffmpeg和nginx搭建一個簡易的HLS伺服器 0. HLS Intro HTTP Live Streaming (also known

    用Python socket實現一個簡單的http伺服器(post 與get 的區別)、CGIHTTPServer 簡單應用

    #!/usr/bin/env python #coding=utf-8import socketimport re HOST = '' PORT = 8000#Read index.html, put into HTTP response dataindex_content = '''HTTP/1.x 200

    一個簡單的HTTP伺服器

    應用程式的入口在HttpServer類中。main()方法建立一個HttpServer例項,然後呼叫await()方法。伺服器會在指定的埠上等待HTTP請求,對其進行處理,然後傳送響應資訊回客戶端。

    爬蟲實戰:一個簡易 Java 爬蟲程式的實現

    前面,我們分別介紹了爬蟲程式的 3 個部分:原始碼下載、內容解析、頁面連結提取。現在,讓我們把這些部分串起來,構建一個完整的簡易爬蟲程式。 爬蟲流程 構建程式前,我們首先需要了解爬蟲的具體流程。 一個簡易的爬蟲程式,具備以下流程: 若

    如何寫一個簡單的HTTP伺服器(重做版)

    最近幾天用C++重新寫了之前的HTTP伺服器,對以前的程式碼進行改進。新的HTTP伺服器採用Reactor模式,有多個執行緒並且每個執行緒有一個EventLoop,主程式將任務分發到每個執行緒,其中採用的是輪盤排程來均勻分配任務。 伺服器的原始碼放在Github。以前的舊版本也放在我的GitHub上,在Oh-

    Tinywebserver:一個簡易的web伺服器

    這是學習網路程式設計後寫的一個練手的小程式,可以幫助複習I/O模型,epoll使用,執行緒池,HTTP協議等內容。 首先回顧程式中的核心內容和主要問題,最後給出相關程式碼。 0. 功能和I/O模型 實現簡易的HTTP服務端,現僅支援GET方法,通過瀏覽器訪問可以返回相應內容。 I/O模型採用Reactor(

    網路程式設計知識(5)--用Netty實現的一個簡單的HTTP伺服器

    用Netty實現的一個簡單的HTTP伺服器,可以處理靜態檔案,例子中的註釋也比較全。 public class HttpServer { public static void main(String[] args) {

    【go語言 socket程式設計系列】一個簡單的HTTP伺服器及func (srv *Server) Serve(l net.Listener) 方法

    【簡單的HTTP伺服器】 原始檔server.go中 ListenAndServe()函式的註釋中有個簡單的HTTP服務實現程式碼,如下 package main import ( "io" "log" "net/http" ) func HelloServ

    android 設計一個簡易Http網路請求框架

        一.開發初衷:最近專案中需要用到版本升級這一塊,需要用到一些基本的資料請求與檔案下載功能。之前做專案都是用別人的網路框架,類似retrofit 、 okhttp、 fresco等框架,用的多了,發現這幾個網路請求框架,無非都是 按解決以下幾個問題為導向的:   1

    【Tomcat8.5原始碼分析】【3】一個簡單的HTTP伺服器

         通過上面兩篇文章的學習,我們知道了HTTP\SOCK\TCP\IP之間的關係以及區別,接下來我們手寫一個HTTP伺服器       首先我們定義一個HttpServer類,該類主要用以建立一個ServerSocket,當有請求進入的時候會通過accept()方法生