2010-04-02 70 views
0

我有一個使用Http(不是套接字)與servlet通信的小程序。目前,小應用程序的每個實例(即,當每個小應用程序由不同計算機上的不同客戶端運行時),所有實例都與相同的小服務程序通信。我想要的是,小程序的每個實例都與相同的servlet的不同實例進行通信。這可能嗎?小應用程序能否與servlet的實例進行通信

+2

servlet容器很可能會對所有請求使用相同的實例,或者至少在不顯示的情況下最不明顯。什麼在推動對不同實例的需求? – 2010-04-02 12:09:40

+0

我正在嘗試實現聊天服務器。我有一個廣播所有代碼,我想用它來在兩個客戶端之間進行廣播。因此,我在想的是我創建了一個包含廣播所有代碼的servlet的新實例,並要求兩個applet只使用該實例來模擬「聊天」。這樣,2個客戶端組將使用同一個servlet實例。 – mithun1538 2010-04-02 12:28:56

+0

真正的問題是現在在這個環節,以防有人需要更好地理解問題。 http://stackoverflow.com/questions/2567377/how-to-initiate-chatting-between-two-clients-and-two-clients-only-using-applets – mithun1538 2010-04-02 15:15:06

回答

2

您不希望在webapp的一生中使用相同servlet的實例。通常的做法是使用HttpSession來區分客戶端。您需要將HttpSession#getId()傳遞作爲參數傳遞給小程序的問題:

<param name="jsessionid" value="${pageContext.session.id}"> 

然後,在小程序連接的Servlet如下:

String jsessionid = getParameter("jsessionid"); 
URL servlet = new URL(getCodeBase(), "servleturl;jsessionid=" + jsessionid); 
URLConnection connection = servlet.openConnection(); 
// ... 

這裏servleturl顯然應該與servlet的url-patternweb.xml。您也可以使用URLConnection.setRequestProperty()來設置Cookie請求標頭。

最後,在Servlet中,獲得和存儲客戶端專用數據,請執行以下操作:

// Store: 
request.getSession().setAttribute("data", data); 
// Get: 
Data data = (Data) request.getSession().getAttribute("data"); 

希望這有助於。

+0

謝謝,你的答案類似於rsp,但更詳細。然而,這個問題是一個子問題:現在的問題是現在在這個環節,以防有人需要更好地理解問題。 http://stackoverflow.com/questions/2567377/how-to-initiate-chatting-between-two-clients-and-two-clients-only-using-applets – mithun1538 2010-04-02 15:14:34

1

從你的問題看來,你的servlet包含狀態。每個小應用程序將有一個session與你的servlet可以訪問的servlet容器。您可以創建一個對象來保存每個會話的狀態,並將該對象作爲attribute放置在調用者的會話中。這樣,servlet容器可以在許多客戶端之間共享一個servlet實例。

0

通常的方式來處理實例的具體行動就是有,不是由具有存儲在servlet本身的信息存儲在由servlet容器提供會話範圍的信息。

對於它的工作,你的applet必須正確發送,由Web容器內提供或者小程序必須要求在servlet內部的實例特定URL餅乾或JSESSIONID屬性。

我建議你用Servlet API的規範進一步瞭解,以瞭解更多關於什麼是提供給您。

另外請注意,某些應用服務器支持的「客戶」,這是具有應用服務器代碼內直接訪問與應用服務器提供的代碼中調用程序的概念。實際的通信是由applcation服務器提供的庫處理的,所以這很簡單。 Glassfish和Trifork可以做到這一點。

相關問題