applet可以与servlet的实例通信

我有一个使用Http(非套接字)与servlet通信的applet。 目前,applet的每个实例(即当每个applet由不同计算机上的不同客户端运行时),所有实例都与同一servlet通信。 我想要的是applet的每个实例与同一个servlet的不同实例进行通信。 这可能吗?

您不希望在webapp的生命周期中拥有相同servlet的不同实例 。 通常的做法是使用HttpSession来区分客户端。 您需要将HttpSession#getId()作为参数传递给相关的applet:

  

然后,在Applet中连接Servlet,如下所示:

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

这里的servleturl显然应该匹配web.xml中的servlet的url-pattern 您也可以使用URLConnection.setRequestProperty()设置Cookie请求标头

最后,在Servlet中,要获取和存储客户端特定数据,请执行以下操作:

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

希望这可以帮助。

从您的问题看来,您的servlet似乎包含状态。 每个applet都有一个servlet容器的会话 ,servlet可以访问它。 您可以创建一个保存每个会话状态的对象,并将该对象作为属性放置在调用者的会话中。 这样,servlet容器可以在许多客户端之间共享一个servlet实例。

处理特定于实例的操作的常用方法是使存储在会话范围中的信息由servlet容器提供,而不是将信息存储在servlet本身中。

要使其正常工作,您的applet必须正确发送Web容器提供的cookie或JSESSIONID属性,否则applet必须在servlet中请求实例特定的URL。

我建议您进一步熟悉Servlet API规范,以便了解有关可用内容的更多信息。

另请注意,某些应用程序服务器支持“客户端”的概念,“客户端”是使用从应用程序服务器提供的代码调用的程序,可直接访问应用程序服务器代码的内部。 实际通信由applcation服务器提供的库处理,因此这很简单。 Glassfish和Trifork可以做到这一点。