我想创建一个Servlet,经过一段时间后可以向其发送数据(GET / POST无关紧要)。这将类似于从客户端到服务器的持久连接。使用这个单一连接,我将不时向Servlet发送一些数据(字符串),在该处将处理数据。这样我不必每次发送数据时都建立新的连接。
我目前尝试的内容。这是我的纯Java客户端:
try {
URL url = new URL("http://localhost:8080/MyProject/MyServletName");
HttpURLConnection connnection = (HttpURLConnection) url.openConnection();
connnection.setRequestMethod("GET");
connnection.setRequestProperty("Connection", "keep-alive");
connnection.setDoOutput(true);
OutputStream writer = connnection.getOutputStream();
String message = "message-";
int counter = 0;
while (counter < 30) {
Thread.sleep(1000);
message = "message-" + counter;
writer.write(message.getBytes());
writer.flush();
counter++;
}
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
因此,理想情况下,此客户端将数据写入输出流,并在1秒后刷新。我应该在Servlet中得到同样的结果。这是我的Servlet代码(doGet方法):
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()));
String line = "";
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
现在,servlet应该每秒钟打印一次从客户端收到的行。但是这里的问题是servlet甚至没有被调用。如果我在客户端类中添加以下行。
int HttpResult = connnection.getResponseCode();
然后调用servlet,但它会完全执行,而不必等待客户端发送的数据。如何使其工作?它应该在那里等待来自客户端的新数据。任何帮助将被申请。谢谢
答案 0 :(得分:1)
如果要使用Servlet API,则受其Request-Response性质的约束(每个请求是一个新连接)。通常,创建HTTP请求并不重要,它的执行速度相对较快,因此您可以每次执行一次。但是,如果它(连接创建时间)对于您的情况确实很重要,则可以考虑使用套接字。使用套接字,您可以完全控制连接生命周期。这种方法的缺点是底层API,据我所知,它需要与Servlet分开使用。
答案 1 :(得分:1)
您要寻找的是WebSocket。
这是一个协议,该协议允许将初始HTTP连接“升级”为持久连接,在此持久连接中客户端或服务器都可以随时发送消息。
它与标准的HTTP Servlet样式的Web应用程序完全不同,因此您必须更改应用程序的 lot 才能对其进行处理。但是您的用例正是创建Websocket的原因。
Apache Tomcat附带了一些Websocket示例(客户端和服务器),如果您想了解其中的一些实现方式。