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