1. 程式人生 > >簡單的web伺服器實現視訊播放

簡單的web伺服器實現視訊播放

準備寫一個web伺服器專門供宿舍看電影用。 之前已經實現基本的web伺服器,今天又把視訊播放器弄好了,接下來就是整合了。 視訊播放器,用的CuPlayer,改改demo就行,之前不成功可能是沒在localhost下測試,視訊是需要伺服器提供檔案傳輸服務的。 1.網頁flash播放器原理:我猜的哈 目前流行播放視訊用swf,讓後用swf去載入視訊。swf本身可以播放視訊(類似qq影音的本地視訊播放工具),放到網頁上,然後播放線上的視訊,這時把線上的看成“本地的”了,原理還是那一套,可以有進度。 我喜歡CKplayer,這個很方便自己定義,換換圖片,即可,程式碼可讀性高, http://baike.baidu.com/link?url=4Hc0eD1B9Uxb0icAkWbbWMK6Lh0JrpAVN0s-sTHDiZGuzghV5iSejSXI-Uv8AD5zCOy0ntK5f4oyjQ-3sMsrOK
2,TomDog 山寨web伺服器 http://edu.51cto.com/index.php?do=lession&id=16295 根據51cto上面講得來做,很不錯,老師講得很細緻,原來以為很難得東西分分鐘就搞定了,思路很清晰,程式碼運用很熟練。我在他的基礎上做了一點點完善。

web伺服器我的理解就是部署在網站伺服器上,與瀏覽器互動的一組程式,最近學習了一下51job上的一個視訊,仿照tomcat寫的一個簡單的web伺服器。

先來羅列一下用java寫web伺服器需要的知識點。

1,伺服器與客戶端通訊,socket。其中伺服器端是serversocket

2,伺服器需要同時處理多個瀏覽器的請求,所以需要用到多執行緒 3,如何相應請求,io操作 4,一些web基礎,請求頭,html等
下面介紹下程式碼: TomDog類:      main()函式,引數可指定埠號,啟動start。      start函式,啟動對應埠號,監聽socket請求,建立執行緒池處理
HandlerRquestThread類: 實現runnable介面(執行緒)定義網站根目錄。      建構函式,拿到socket,處理得到輸入和輸出流in/out      paresRequestHead(),處理請求頭,獲得請求檔案,並返回      getFile,列印目標檔案,即找到相應檔案轉向輸出流      Dirshow,用於羅列目錄,可以404禁止      sendError(),傳送錯誤資訊      run(),執行緒函式題,呼叫上面函式拿到檔案命,並把檔案輸出到輸出流。
難點是需要基礎足夠紮實,執行緒,io這裡很重要。 [java]
  view plain  copy
  1. package duola;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.ServerSocket;  
  5. import java.net.Socket;  
  6. import java.util.concurrent.ExecutorService;  
  7. import java.util.concurrent.Executors;  
  8.   
  9. /* 
  10.  * 1,多個瀏覽器同時訪問(多執行緒) 
  11.  * 2.如何提供服務(socket) 
  12.  * 3,如何返回響應(IO) 
  13.  * 山寨web伺服器 
  14.  */  
  15. public class TomDog {  
  16.       
  17.     private static int PORT = 8080;  
  18.       
  19.     public static void main(String[] args){  
  20.         /* 
  21.          * 通過命令列設定埠 
  22.          */  
  23.         int p = (args.length > 0)?Integer.parseInt(args[0]):PORT;  
  24.         new TomDog().start(p);  
  25.     }  
  26.       
  27.     /* 
  28.      * 服務啟動方法 
  29.      * 建立socket伺服器 
  30.      */  
  31.     public void start(int port){  
  32.         try{  
  33.             ServerSocket ss = new ServerSocket(port);  
  34.             System.out.println("----------------監聽[" + port + "]埠的伺服器啟動----------------");  
  35.             while(true){  
  36.                 Socket socket = ss.accept();  
  37.                 System.out.println("-------------有客戶端請求------------");  
  38.                 //new Thread(new HandlerRquestThread(socket));//執行緒的方法,效率一般  
  39.                 /* 
  40.                  * 建立向城池,將任務提交給執行緒池去處理 
  41.                  */  
  42.                 ExecutorService pool = Executors.newFixedThreadPool(100);//執行緒池,預計100個同時來  
  43.                 pool.submit(new HandlerRquestThread(socket));//有人來,就從池子裡面取出一個執行緒  
  44.             }  
  45.         }catch(IOException e){  
  46.             e.printStackTrace();  
  47.         }  
  48.     }  
  49. }  

[java]  view plain  copy
  1. package duola;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedReader;  
  5. import java.io.File;  
  6. import java.io.FileInputStream;  
  7. import java.io.FileNotFoundException;  
  8. import java.io.IOException;  
  9. import java.io.InputStream;  
  10. import java.io.InputStreamReader;  
  11. import java.io.PrintStream;  
  12. import java.net.Socket;  
  13. import java.net.URLDecoder;  
  14.   
  15. /* 
  16.  * 專門處理不同的客戶端請求的多執行緒類 
  17.  */  
  18. public class HandlerRquestThread implements Runnable{  
  19.     private InputStream in = null;  
  20.     //因為混色機瀏覽器內容的輸出,所以使用了printStream 標準輸出流  
  21.     private PrintStream out = null;  
  22.     public static final String WEB_ROOT = "H:"+File.separator+"AppServ"+File.separator+"www"+File.separator;  
  23.     public static final boolean DirShow = true;//是否允許列出目錄檔案  
  24.       
  25.     /* 
  26.      * 通過構造器獲得Socket 
  27.      * 並通過Socket獲取對客戶端的輸入和輸出流 
  28.      */  
  29.     public HandlerRquestThread(Socket socket){  
  30.         try {  
  31.             in = socket.getInputStream();  
  32.             out = new PrintStream(socket.getOutputStream());  
  33.         } catch (IOException e) {  
  34.             // TODO Auto-generated catch block  
  35.             e.printStackTrace();  
  36.         }  
  37.     }  
  38.       
  39.     /* 
  40.      * 解析請求頭,獲得客戶端請求的資源名稱 
  41.      * in 輸入流 
  42.      * return 請求的資源名稱 
  43.      */  
  44.     public String parseRequestHead(InputStream in) throws IOException{  
  45.         //客戶端發起請求會將一些請求資料包含在請求頭中  
  46.         BufferedReader br = new BufferedReader(new InputStreamReader(in));  
  47.         //請求頭的第一行將包含請求的方式,資源,協議  
  48.         String headContent = br.readLine();  
  49.         String[] heads = headContent.split(" ");//空格分割成陣列  
  50.         System.out.println("解析請求頭:");  
  51.         System.out.println(headContent);  
  52.         if(heads[1].equals("/"))  
  53.             heads[1] = heads[1]+"index.html";  
  54.         return heads[1];  
  55.     }  
  56.       
  57.       
  58.     public void getFile(String fileName) throws IOException{  
  59.         File file = new File(WEB_ROOT+fileName);  
  60.         System.out.println("傳送檔案:");  
  61.         System.out.println(file.toString());  
  62.         if(!file.exists()){  
  63.             //System.out.println("不存在");  
  64.             sendError("404""您請求的資源["+fileName+"]不存在!");  
  65.         }else if(file.isDirectory()){  
  66.             File temp = new File(WEB_ROOT+fileName+File.separator+"index.html");  
  67.             if(temp.exists()){  //首頁存在,顯示首頁  
  68.                 getFile(fileName+File.separator+"index.html");  
  69.             }else if(DirShow){  
  70. //              if(fileName.endsWith("/")){  
  71. //              //如果檔案不以/結尾,檔案超連結不會以file為當前目錄,而是結尾有/的,本來想用301重定向,後來用../file/搞定了  
  72. //                  Dirshow(file);  
  73. //              }  
  74.                 Dirshow(file);  
  75.             }else  
  76.                 sendError("403""403 Forbidden");  
  77.         }else{  
  78.             //FileInputStream fis = new FileInputStream(file);  
  79.             BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));  
  80.             byte[] buff = new byte[(int)file.length()];  
  81.             int len = bis.read(buff);  
  82.               
  83.             out.println("HTTP/1.1 200 OK");  
  84. 相關推薦

    簡單web伺服器實現視訊播放

    準備寫一個web伺服器專門供宿舍看電影用。 之前已經實現基本的web伺服器,今天又把視訊播放器弄好了,接下來就是整合了。 視訊播放器,用的CuPlayer,改改demo就行,之前不成功可能是沒在localhost下測試,視訊是需要伺服器提供檔案傳輸服務的。

    H5簡單實現視訊播放歷史定位

    html <video id="Video" controls autoplay controlsList="nodownload"> </video> js $('#Video').on("loadedmetadata", fu

    go語言實現簡單web伺服器

    go語言讓web伺服器實現和部署變得異常簡潔.終於可以拋開亂七八糟的專案結構和體積龐大的IDE,一窺其基本原理. 首先是一個簡單的伺服器實現程式碼,如果是GET請求,則回送一條This is a GET request訊息,如果是POST請求,則解析POST請

    自己開發簡單web伺服器一(C++開源庫websocketpp實現

    簡要 Web伺服器主要處理的是HTTP請求(這裡忽略HTTPS),HTTP協議建立在TCP上。如果自己實現,無非就是網路程式設計(socket接受、傳送),資料解析(HTTP欄位解析),返回HTTP協議字串給客戶端等。說起來簡單,要做到跨平臺和高效,不得不介紹幾個有名的開源

    一個簡單web伺服器的java實現

    一個簡單的web伺服器在不考慮其效能及健壯性的情況下,通常只需實現的功能包括伺服器的啟動,它用於監聽某一個埠,接收客戶端發來的請求,並將響應結果返回給客戶端。本文將介紹一個簡單web伺服器的實現原理,它本身只能處理某個目錄下的靜態資原始檔(文字、圖片等)。採用java

    python uwsgi實現簡單web伺服器(8程式碼)

    python uwsgi實現的簡單web伺服器,一共用了8行程式碼。 先說一下web領域的幾個概念,主要是舉例: web伺服器:apache、iis、nginx等。 web應用伺服器:tomcat、

    fairyGUI簡單實現視訊播放

    1.fairyGUI;裡建立一個轉載器,匯出資源包到unity 2.將視訊轉為ogv格式放至resource資料夾下 這種方式支援的視訊格式較少比較簡便。 第二種 用3D模型Quad載入到fairyGUI的圖形控制元件上 視訊載入方式相同,只是載入到了模型的材質球上

    自己開發簡單web伺服器二(Node.js實現

    Node.js 剛接觸Node.js沒多久,試用了一下,輕輕鬆鬆幾行程式碼就可以實現一個簡單的HTTP伺服器,開發起來的確比其他語言快多了。 Node.js是一個開源的JavaScript庫,可以跨平臺執行在Windows、Linux、Mac上。JS解析庫用的是大名鼎鼎的G

    一個簡單的靜態web伺服器實現

    看完tomcat原理後,想自己用java仿一個簡單的tomcat,先實現一個靜態的web伺服器。需要的技術有java網路程式設計(tcp/ip協議、http協議、socket等基礎知識) 原始碼下載連

    利用xinetd實現簡單web伺服器(映象站)

    瀏覽效果: linux伺服器安裝xinetd後,在/etc/xinetd.d/目錄下建立xhttpd檔案,並輸入內容: service xhttpd { socket_type = stream protocol = tcp wait = no

    c語言實現簡單web伺服器

    浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

    MicroPython TPYBoard v201 簡單web伺服器實現過程

    前言 TPYBoard v201開發板上搭載了乙太網轉TTL串列埠模組(USR-K2),從而實現了TCP通訊的功能。既然可以T

    簡單HTTP伺服器實現

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

    ExtJS實現視訊播放功能以及設定視訊播放起始時間呼叫mediaplayer

    ExtJS在語法上用起來和JS還是有一定區別,初始用起來很不習慣,但總起來說還是把視訊播放的功能做出來了,分享出來,以供參考。 使用ExtJS呼叫mediaplayer其實還是用的<embed>標籤或者使用<object></object>標籤,在我參考不少文

    android,Exoplayer實現視訊播放

    bundle配置: implementation 'com.google.android.exoplayer:exoplayer-core:2.8.1'implementation 'com.google.android.exoplayer:exoplayer-dash:2.8.1'implementati

    qt實現視訊播放

    本篇部落格介紹如何利用qMediaPlayer和qvideowidget實現視訊檔案(avi,mp4....)的播放,並且提供進度顯示,還可以通過拖動進度條來變換播放位置。相關程式碼可以在我的資源裡下載"基於qt的視訊播放器" pro檔案: #------------------------

    用video.js和windows自帶播放外掛MediaPlayer實現視訊播放

    由於本人在搜尋資料沒有找到video.js外掛支援ie8的方法,所以在做檢視視訊的功能時想法是這樣的,對於谷歌和IE10以上用video.js的方法實現,而IE9及IE8用MediaPlayer實現。下面是實現程式碼(只測試過mp4格式的): 1.video.js實現 &

    go搭建一個簡單web伺服器

    Go語言裡面提供了一個完善的net/http包,通過http包可以很 方便的就搭建起來一個可以執行的web服務。同時使用這個包能很簡單地對web的路由,靜態檔案,模版,cookie等數 據進行設定和操

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

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

    android客戶端+JAVA WEB伺服器實現json資料解析

    import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.But