2010-07-29 64 views
3

我想實現自己的網絡服務器在純Java 網絡服務器應該只支持靜態資源(如HTML,JS,CSS,圖片,電影等)實現的網絡服務器

你能推薦一篇關於如何實現這樣的事情的教程或文章嗎? 我應該使用少量進程還是線程池,還是應該考慮面向NodeJS的循環事件?

我知道有免費的網絡服務器,正是我正在尋找的東西,但我希望這樣做是爲了我自己。

+0

下載Apache Tomcat源代碼,看看他們是如何做到的? – 2010-07-29 13:37:10

+2

@君子:我甚至都不會去嘗試。 Tomcat太配置機會,閥門,擴展太多,只是爲了看看如何處理請求以返回文件內容... – f1sh 2010-07-29 13:55:59

+0

@The精英紳士:我曾試過這個......那東西很大。 – 2011-03-05 00:48:17

回答

1

我建議您熟悉HTTP請求格式http://datatracker.ietf.org/doc/rfc2616/。從頭開始實施HTTP不是一件容易的事,但它確實是一個很好的學習練習。

爲了簡單起見,在Java本身中,我建議使用一個請求線程服務器 - http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html - 使用java.nio來提供服務文件。在併發設置java.nio優於java.io,因爲它更好地平衡負載。您可能會發現基準暗示java.io更快,但這是針對順序單線程代碼的。

+1

如果您不介意使用JDK 7的早期訪問權限,可能會更好地嘗試java.nio2。 – 2010-10-27 12:57:04

3
+1

爲什麼多線程是正確的接近? – DuduAlul 2010-07-29 13:58:52

+0

取決於流量和Web服務器的用途,如果你只想提供靜態頁面,我認爲這是更簡單和更好的方法。如果您打算使用慧星,或者您將有很多事件驅動的併發流量事件更好,則在連接打開時,您不需要爲每個請求阻塞一個線程。 – 2010-08-04 08:56:52

3

如果你正在做這個作爲一個練習,我推薦一個事件驅動模型什麼。

我不認爲這個主題有一個教程,因爲所需的知識是如此之廣 - HTTP協議,文件訪問,線程和併發,配置文件管理,套接字通信,日誌記錄,錯誤處理,MIME類型...是的,即使只是分享靜態資源,它仍然是一個巨大的。

閱讀,祝你好運!

1

你可能會發現ACME web服務器有趣的一個起點。我們將它用於臨時文件傳輸。當你familarized自己有了它,你可以看到,如果你能發現它的瓶頸,然後就如何解決它深思:)

http://acme.com/java/software/Acme.Serve.Serve.html

0

我建議Apache MINA做這項工作。它允許您指定編碼器/解碼器正確處理HTT協議,並在請求到達時調用方法等。它在內部處理線程管理。沒有它,我永遠不會開始一個網絡項目。