2012-12-16 261 views
3

我有Java Server Faces Web應用程序需要在網絡計算機上的桌面應用程序中調用方法。這臺機器將在特定的機器上執行一些邏輯。完成後,它應該調用Web應用程序上的方法來報告其狀態。 這兩種方法都是void,但確實需要參數。Java EE,通信Web應用程序和桌面應用程序

什麼是最好的開發方式? 我已經考慮了一些選擇:

  • 套接字:我讀過你不應該在Web應用程序中使用套接字多個帖子。
  • Soap:我可以在Web應用程序上設置一個服務器,但不能在桌面應用程序上。
  • JCA適配器:我對此沒有任何認識。

的WebApp

class WebAppClient { 
     public void start(String x, List<String> y) { 
      // Call DesktopServer.start(x, y); 
     } 
    } 

    interface WebAppServer { 
     public void reportBack(String info); 
    } 

DesktopApp

class DesktopClient 
     public void reportBack(String info) { 
      // Call WebAppServer.reportBack(info); 
     } 
    } 

    interface DesktopServer { 
     public void start(String x, List<String> y); 
    } 
+2

無論您選擇哪種解決方案,它都必須通信並使用套接字來執行此操作。所以用socket編寫你自己的解決方案並不是一個壞主意,特別是你只需要在兩個方向上都有一條消息。 –

+0

嗯,我怎麼讀過Stackoverflow上的多個帖子,聲明這不應該是要走的路?有沒有任何安全風險? – Aquillo

+0

你只需要明白你在做什麼。當然,如果你直接從請求處理線程中打開很多套接字,然後等待一些消息進入套接字,那麼就會阻止線程被用於服務另一個HTTP請求,並且你可能會很快用完線程和一個完全沒有響應的web應用程序。OTOH,如果您使用單個專用線程來處理單個套接字通信,我不會看到有什麼不好的事情會發生。 –

回答

0

你說得對插座,他們是簡單易用,但許多網絡封鎖簡單的TCP套接字,並只允許HTTP,和有時只能通過HTTP代理。

HTTP是要走的路,但HTTP不允許服務器發起對話,它迫使你在請求響應模型中工作。

不過,也有一些方法可以用來爲了克服這個限制:

  • 簡單的投票:您剛纔定期輪詢服務器,以知道,如果你有一個新的消息。

  • 長輪詢:你輪詢服務器,但請求保持打開,直到服務器有話要說,這也被稱爲「彗星」協議,並有像jetty一樣實現。

  • websockets:html5的一個特性,顧名思義,它提供了一個真正的雙向套接字。這還不是所有網絡設置都支持的。例如,一些代理會阻止它。

您應該對每種方法進行一些研究,並針對您的情況選擇正確的方法。

祝你好運。

相關問題