使用Java實現支持視頻點播的WEB服務器 (1)

發表于:2007-06-10來源:作者:點擊數: 標簽:
一.項目簡介: JAVA語言是一種可移植的,簡單的,健壯的 嵌入式 語言。并且對 網絡 , 數據庫 有很好的支持,基于JAVA語言的這種特性可以十分容易地建立一個小型INTERNET 服務器 。 本項目中,作者用JAVA語言編寫了一個WEB微型服務器,對簡單的HTTP請求進行

 

 

 

 

 

 

 

 

一.項目簡介:

JAVA語言是一種可移植的,簡單的,健壯的嵌入式語言。并且對網絡,數據庫有很好的支持,基于JAVA語言的這種特性可以十分容易地建立一個小型INTERNET服務器。

本項目中,作者用JAVA語言編寫了一個WEB微型服務器,對簡單的HTTP請求進行響應,并通過后端數據庫對用戶的查詢進行處理,從而動態地返回HTML頁面。

二.項目實現:

(一)項目具體功能分析與開發工具選擇

可以利用一臺較高配置的個人臺式機就可以實現社區內的小型服務器,包括網頁瀏覽,基于高速局域網的視頻下載和播放,定時新聞組發布程序,郵件服務器等服務。

本軟件實際上是一個HTTP協議的服務器。HTTP(Hyper Text Transfer Protocol),是一個專門為Web服務器和Web瀏覽器之間交換數據而設計的網絡協議。它通過規定通用資源定位符(URLs)使客戶端的瀏覽器與服務器的Web資源建立鏈接關系,從而奠定了用戶對Internet透明訪問的基礎。

在本軟件中通過傳輸HTML文件使客戶端可以實現網頁瀏覽。HTML是WWW的通用標記語言,它用來創建Web頁面和控制Web信息顯示格式。HTML不是編程語言,而是一種描述語言。HTML2.0得到了IETF(Internet Engineering Task Force)的支持而成為Internet國際標準。目前,HTML已經發展到3.0和4.0版,只是新版本的標準尚未完全統一,不同的商家對HTML2.0進行了一定的擴充,引入了更多新的功能。例如,Netscape公司在HTML3.0中增加了頁面底圖(Background Images)和表(Table)定義等標記,使得Web頁面更加引人入勝。

CGI是通用網關接口(Common Gateway Interface)的簡稱,它是Web服務器與外部程序之間的通信接口,服務器并不關心外部應用程序是什么語言(如C、C++、Pascal、Delphi或Perl)編寫的,它只是負責接收用戶輸入的信息,并把CGI程序所產生的結果--HTML文檔或其他符合HTTP規定的文件回傳給用戶。事實上,CGI是動態Web頁面制作的第一步,但由于CGI程序實現比較困難,而且效率不高,它已經逐漸被新的技術所取代。

網頁瀏覽支持的網頁包括HTML,JAVASCRIPT,APPLET,VBSCRIPT等編寫的網頁,但不支持PHP,ASP等服務器端動態程序的網頁。由于服務器的規模較小,所以服務器端動態程序被集成進服務器中。但可以通過編寫符合一定規則的JAVA的CGI程序實現服務器端的動態性,不過這種JAVA程序的安全性很難保證。

(二)服務器的實現

1. 處理連接策略:

對于每一個用戶的連接我們采取了每次請求滿足后,將用戶與服務器的連接斷開,這時用戶如果有其他的請求,則進入請求隊列重新進行資源競爭。

通常網頁中的每一個圖形都會被看成是一個單獨的連接,也就是說對于一個圖形很多的網頁基于本服務器的連接策略將會進行多次請求,這樣的好處是防止一個容量很大的網頁獨占網絡資源。

2. 與數據庫連接

在與數據庫的連接中我們選用的后端數據庫是微軟的ACCESS數據庫,由于本項目是面向小型社區的社區數據中心服務器,所以選用小型的數據庫。由于JAVA的可移植性可以將服務器用在LINUX平臺上,這時可以用本服務器提供的數據庫配置程序連接到MySql等基于LINUX的小型數據庫。

我們應用JDBC完成與數據庫的連接。Java的一項出色能力是構建與平臺無關的客戶機/服務器數據庫應用。在Java 1.1中,通過Java數據庫連接(JDBC)實現了與各家公司之間的數據庫的互連。數據庫最主要的一個問題就是各家公司之間的規格大戰。確實存在一種"標準"數據庫語言,即"結構查詢語言"(SQL-92),但各公司為了表示自己的與眾不同對標準都有一些微小的改動。所以通常必須確切知道自己要和哪家數據庫公司打交道,否則極易出問題,盡管存在所謂的"標準"。JDBC是面向"與平臺無關"設計的,所以在編程的時候不必關心自己要使用的是什么數據庫產品。和Java中的許多API一樣,JDBC也做到了盡量的簡化。我們發出的方法調用對應于從數據庫收集數據時想當然的做法:同數據庫連接,創建一個語句并執行查詢,然后處理結果集,無論與我們打交道的是哪家數據庫廠商的產品。

JDBC的使用:

為實現這一"與平臺無關"的特點,JDBC為我們提供了一個"驅動程序管理器",它能動態維護數據庫查詢所需的所有驅動程序對象。所以假如要連接由數家公司開發的不同種類的數據庫,就需要每個數據庫的單獨的驅動程序對象。驅動程序對象會在裝載時由"驅動程序管理器"自動注冊,并可用Class.forName()強行裝載。

為打開一個數據庫,必須創建一個"數據庫URL",它要指定下述三方面的內容:

(1) 用"jdbc"指出要使用JDBC。

(2) "子協議":驅動程序的名字或者一種數據庫連接機制的名稱。由于JDBC的設計從ODBC吸收了許多靈感,所以可以選用的第一種子協議就是"jdbc-odbc橋",它用"odbc"關鍵字即可指定。

(3) 數據庫標識符:隨使用的數據庫驅動程序的不同而變化,但一般都提供了一個比較符合邏輯的名稱,由數據庫管理軟件映射(對應)到保存了數據表的一個物理目錄。為使自己的數據庫標識符具有任何含義,必須用自己的數據庫管理軟件為自己喜歡的名字注冊(注冊的具體過程又隨運行平臺的不同而變化)。

所有這些信息都統一編譯到一個字串里,即"數據庫URL"。本例中,我們想通過ODBC子協議同一個標識為"vod"的數據庫連接,相應的數據庫URL設為:

String dbUrl = "jdbc:odbc:vod"

同樣如果通過一個網絡連接,數據庫URL也需要包含對遠程機器進行標識的信息。

JDBC的連接方式:

首先,JDBC中在DriverManager中對數據庫數據庫驅動程序進行登記。

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

裝載JDBC- ODBC橋驅動程序,這樣做是為了讓DriverManager可以找到數據庫驅動程序。然后利用DriverManager打開與數據庫的連接。

Mycon=DriverManager.getConnection(dbUrl);

本語句的作用是,確定與由dbUrl指定的數據庫的連接。DriverManager將從其中登記的驅動程序中尋找最適當的驅動程序。返回的Mycon代表了與特定的數據庫之間的連接?!?

Mysta=Mycon.createStatement();

生成可以執行無參數SQL語句的Statement接口。 然后就可以在Mysta中用executeQuery()函數執行SQL語句從返回的ResultSet獲取執行結果。

3. 網絡連接:

網絡本身的概念并不難。我們想獲得位于其他地方某臺機器上的信息,并把它們移到這兒;或者相反。這與讀寫文件非常相似,只是文件存在于遠程機器上,而且遠程機器有權決定如何處理我們請求或者發送的數據。但大多數編程語言對網絡編程都較困難,而Java最出色的一個地方就是它的"無痛苦連網"概念。有關連網的基層細節已被盡可能地提取出去,并隱藏在JVM以及Java的本機安裝系統里進行控制。我們使用的編程模型是一個文件的模型;事實上,網絡連接(一個"套接字")已被封裝到系統對象里,所以可象對其他數據流那樣采用同樣的方法調用。除此以外,在我們處理另一個連網問題--同時控制多個網絡連接--的時候,Java內建的多線程機制也是十分方便的。

服務器的主要任務是偵聽建立連接的請求,這是由我們創建的特定服務器對象完成的。而客戶機的任務是試著與一臺服務器建立連接,這是由我們創建的特定客戶機對象完成的。一旦連接建好,那么無論在服務器端還是客戶機端,連接變成了一個IO數據流對象。從這時開始,我們可以象讀寫一個普通的文件那樣對待連接。所以一旦建好連接,我們只需使用自己熟悉的IO命令即可。

首先,server=new ServerSocket(80,aclearcase/" target="_blank" >cceptamount);

生成一個服務器端的套接字。其中第一個參數是表示服務器的監聽端口,端口是機器內獨一無二的場所。有些時候,一個IP地址并不足以完整標識一個服務器。這是由于在一臺物理性的機器中,往往運行著多個服務器(程序)。由IP表達的每臺機器也包含了"端口"(Port)。我們設置一個客戶機或者服務器的時候,必須選擇一個無論客戶機還是服務器都認可連接的端口。端口并不是機器上一個物理上存在的場所,而是一種軟件抽象(主要是為了表述的方便)??蛻舫绦蛑廊绾瓮ㄟ^機器的IP地址同它連接,但怎樣才能同自己真正需要的那種服務連接呢(一般每個端口都運行著一種服務,一臺機器可能提供了多種服務,比如HTTP和FTP等等)?端口編號在這里扮演了重要的角色,它是必需的一種二級定址措施。

在HTTP協議中的默認服務端口是80,當然在小型社區中也可以使用其它的端口。本例中使用了默認服務端口。

Socket s=server.accept();

這一句的作用是使服務器監聽本機上的80端口,等待客戶機的連接。在沒有新的連接的情況下,服務器阻塞自身。當客戶機連接到服務器后函數返回一個套接字。然后,通過套接字的輸入,輸出流即可用讀取本機文件的方法與客戶機進行通信。


1 2 下一頁>>




原文轉自:http://www.anti-gravitydesign.com

評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97