在几个时间间隔后将数据发送到servlet

时间:2018-06-30 12:59:40

标签: java tomcat servlets java-ee persistent-connection

我想创建一个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,但它会完全执行,而不必等待客户端发送的数据。如何使其工作?它应该在那里等待来自客户端的新数据。任何帮助将被申请。谢谢

2 个答案:

答案 0 :(得分:1)

如果要使用Servlet API,则受其Request-Response性质的约束(每个请求是一个新连接)。通常,创建HTTP请求并不重要,它的执行速度相对较快,因此您可以每次执行一次。但是,如果它(连接创建时间)对于您的情况确实很重要,则可以考虑使用套接字。使用套接字,您可以完全控制连接生命周期。这种方法的缺点是底层API,据我所知,它需要与Servlet分开使用。

答案 1 :(得分:1)

您要寻找的是WebSocket

这是一个协议,该协议允许将初始HTTP连接“升级”为持久连接,在此持久连接中客户端或服务器都可以随时发送消息。

它与标准的HTTP Servlet样式的Web应用程序完全不同,因此您必须更改应用程序的 lot 才能对其进行处理。但是您的用例正是创建Websocket的原因。

Apache Tomcat附带了一些Websocket示例(客户端和服务器),如果您想了解其中的一些实现方式。