【问题标题】:Send data to servlet after several time interval在几个时间间隔后向 servlet 发送数据
【发布时间】:2018-12-09 10:34:07
【问题描述】:

我想创建一个 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被调用,但它被完全执行并且不等待从客户端发送的数据。将如何使其发挥作用?它应该在那里等待来自客户端的新数据。任何帮助都将不胜感激。谢谢你

【问题讨论】:

  • 您正在读取 servlet 中的行,但客户端不会写入任何 EOL 字符。所以 servlet 阻塞,等待行结束。
  • 所以基本上你想要一个以 N 间隔发送数据的客户端和一个始终运行的持久服务器?
  • @Aris 是的,我想建立一个持久连接。然后在一段时间后定期将数据发送给它

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


【解决方案1】:

你要找的是WebSocket

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

它与标准的 HTTP servlet 样式的 Web 应用程序完全不同,因此您必须更改应用程序的 很多 以应对它。但是您的用例正是创建 Websocket 的原因。

Apache Tomcat 附带了一些 Websocket 示例(客户端和服务器),如果您想了解其中一些是如何完成的。

【讨论】:

  • 谢谢@christopher。的建议。将尝试使用 web scokets 来实现相同的目标。 :)
【解决方案2】:

如果您想使用 Servlet API,您会受到其请求-响应性质的限制(每个请求都是一个新连接)。通常,创建一个 HTTP 请求没什么大不了的,它的执行速度相对较快,因此您可以每次都执行它。但是,如果它(连接创建时间)对您的情况非常重要,您可以考虑使用套接字之类的东西。使用套接字,您可以完全控制连接生命周期。这种方法的缺点是低级 API,据我所知,它需要与 Servlet 分开使用。

【讨论】:

  • 谢谢。现在肯定会研究套接字。然后会尝试实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 2023-03-06
  • 2021-10-19
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多