2010-04-02 42 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可以做到这一点。

相关问题