2013-12-15 56 views
-1

我們需要設計一個服務器,該服務器將爲多個客戶端提供網頁,還需要爲這些客戶端查詢遠程數據庫。該項目的一個要求是整個系統必須符合REST架構風格。我們需要使用Java作爲編程語言,但是在設計它時出現了許多問題。關於套接字編程和REST設計

我們希望有一個主線程,將獲得連接,如本例所示:

// System.out.println("Starting a new web server using port " + port) 

    try { 
     ServerSocket reciever = new ServerSocket(port); 
     while (true) { 
      try { 
       Socket s = reciever.accept(); 
       Client c = new Client(s);  
      } catch (IOException e) { 
       System.err.println("New item creation failed."); 
       IOUtil.close(reciever); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } catch (IOException e) { 
     System.err.println("ServerSocket problem."); 
    } 

然後,每個連接將被創建爲一個新的線程(在代碼中的客戶對象),將採取關心閱讀一個請求。如果請求是GET,那麼線程將爲客戶端提供資源。如果它是一個POST,那麼它會將請求添加到緩衝區,並讓另一個線程處理對數據庫的查詢,並將答案返回給客戶端。在處理這個唯一的請求之後,線程關閉套接字並終止。

套接字是否違反了REST原則?爲了尊重REST架構,我們是否需要在每個HTTP消息之後銷燬每個Client對象(線程&套接字)?客戶端 - 服務器通信是否有另一種不使用套接字的方式?

+0

爲什麼地球上不使用JEE?整個服務器事情都由你來處理,你所要做的就是決定一個函數應該監聽什麼路徑,並在其後面寫一些邏輯(如果你選擇使用servlet)。說真的,你不應該再浪費一點時間來重新發明輪子。 – thecoshman

+0

好吧,我們看了看Apache HHTPComponents,它對我們的任務來說似乎是一個很好的API。這是你在說什麼? – tyrana4

+0

什麼? AFAIK Apache與JEE無關。你會運行一個'容器',就像JBoss。這個容器可以管理所有無聊的網頁內容。然後你可以寫一個類(對於初學者),用'@Path('/ mySite/cakes /')'註釋一個函數,並且該函數將被調用任何與之相匹配的URL。 – thecoshman

回答

1

好的,我認爲你會把一大堆垃圾混淆在一起。

首先,允許數據從A到B的低級IP套接字和使用HTTP引導從客戶端到服務器的連接的'websockets'不同,後者可以保持開放以進行雙向通信。

根據您的要求,您只需要一個'標準'JEE容器。使用諸如JAX-RS之類的東西,你可以將一些基本註釋應用於諸如@PATH('/MyResource/Cars/')之類的函數,併爲該路徑調用該函數。

使用容器可以讓你擺脫所有那些無聊的樣板垃圾。無需手動設置線程來偵聽,併產生其他線程來處理請求。

使用IP套接字是(間接)REST的任務; REST必須(根據Fielding,但嚴格地說它是協議不可知的)通過HTTP,因此通過TCP/IP套接字(儘管顯然你可以通過任何其他傳輸協議來執行HTTP)。然而,Websockets使用HTTP來形成客戶端和服務器之間持久的有狀態連接,這與REST基本相反。基本的HTTP會(並且你會通過容器爲你做)完全打開並關閉每個隔離請求的連接,但實際上,HTTP(以及REST)將允許低層連接(TCP連接是啓動緩慢)以維持一系列請求。此功能旨在用於加載HTML頁面的範圍,以及一個TCP連接中的所有資源,但通過許多HTTP請求。

1

套接字通過TCP/IP移動字節。這是一個較低級別的協議,您不必擔心這一點。你關心更高的協議(在這種情況下是HTTP)。

每次請求後HTTP都會關閉套接字,所以你的想法聽起來很合理。雖然我不確定爲什麼要爲POST請求創建單獨的線程。我假設你的Client實現已經在自己的線程中運行(如果沒有,那麼你的服務器效率不高)。

+0

事實上,由於諸如保持活動之類的事情,在HTTP/1.1中的每個請求之後,套接字都不會被關閉。 –

+0

@DonalFellows確實如此,但我想避免深入研究錯綜複雜。一個簡單的HTTP服務器實現將關閉請求之間的連接,而OP似乎對於不同協議的工作方式有點缺乏。 – Kayaman