我有一个使用Http(非套接字)与servlet通信的applet。当前,applet的每个实例(即,当每个applet由不同计算机上的不同客户端运行时),所有实例都与相同的servlet通信。我想要的是applet的每个实例都与相同的servlet 的不同实例进行通信。这可能吗?
答案 0 :(得分:2)
您不希望在webapp的生命周期中拥有相同servlet的不同实例。通常的做法是使用HttpSession
来区分客户端。您需要将HttpSession#getId()
作为参数传递给相关的applet:
<param name="jsessionid" value="${pageContext.session.id}">
然后,在Applet中按如下方式连接Servlet:
String jsessionid = getParameter("jsessionid");
URL servlet = new URL(getCodeBase(), "servleturl;jsessionid=" + jsessionid);
URLConnection connection = servlet.openConnection();
// ...
此处servleturl
显然应与url-pattern
中的servlet web.xml
匹配。您也可以使用Cookie
设置URLConnection.setRequestProperty()
请求标头。
最后,在Servlet中,要获取和存储客户端特定数据,请执行以下操作:
// Store:
request.getSession().setAttribute("data", data);
// Get:
Data data = (Data) request.getSession().getAttribute("data");
希望这有帮助。
答案 1 :(得分:1)
从您的问题看来,您的servlet似乎包含状态。每个applet都有一个session,其中包含servlet可以访问的servlet容器。您可以创建一个保存每个会话状态的对象,并将该对象作为attribute放置在调用者的会话中。这样,servlet容器可以在许多客户端之间共享一个servlet实例。
答案 2 :(得分:0)
处理特定于实例的操作的常用方法是将存储在会话范围中的信息由servlet容器提供,而不是将信息存储在servlet本身中。
要使其正常工作,您的applet必须正确发送Web容器提供的cookie或JSESSIONID属性,否则applet必须在servlet中请求实例特定的URL。
我建议您进一步熟悉Servlet API规范,以便了解有关可用内容的更多信息。
另请注意,某些应用程序服务器支持“客户端”的概念,“客户端”是使用从应用程序服务器提供的代码调用的程序,可直接访问应用程序服务器代码的内部。实际通信由applcation服务器提供的库处理,因此这很简单。 Glassfish和Trifork可以做到这一点。