Отправить данные сервлету через несколько интервалов времени
Я хочу создать сервлет, в который я могу отправлять данные (GET/POST не имеет значения) через некоторый промежуток времени. Это будет что-то вроде постоянного подключения от клиента к серверу. Используя это единственное соединение, я буду время от времени отправлять некоторые данные (String) сервлету, где они будут обрабатываться. так что мне не нужно устанавливать новое соединение каждый раз, когда я хочу отправить данные.
Что я пробовал в настоящее время. Вот мой чистый клиент 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 секунду. И то же самое я должен получить в моем сервлете. Вот мой код сервлета (метод doGet):
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()));
String line = "";
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
Теперь сервлет должен печатать строку, полученную от клиента, через каждую секунду. но проблема здесь в том, что сервлет даже не вызывается. Если я добавлю ниже строку в моем классе клиента.
int HttpResult = connnection.getResponseCode();
Затем вызывается сервлет, но он выполняется полностью и не ждет данных, отправленных клиентом. Как это будет работать? Это должно быть там в ожидании новых данных от клиента. Любая помощь будет оценена. Благодарю вас
2 ответа
То, что вы ищете, это WebSocket.
Это протокол, который позволяет "обновить" исходное HTTP-соединение до постоянного соединения, когда клиент или сервер могут отправлять сообщения в любое время.
Он радикально отличается от стандартного веб-приложения в стиле HTTP-сервлетов, поэтому вам придется многое изменить, чтобы справиться с ним. Но ваш вариант использования - именно то, для чего был создан Websocket.
Apache Tomcat поставляется с некоторыми примерами Websocket (как клиентскими, так и серверными), если вы хотите посмотреть, как это делается.
Если вы хотите использовать Servlet API, вы ограничены его характером "запрос-ответ" (каждый запрос является новым соединением). Обычно создание HTTP-запроса не составляет особого труда, он выполняется довольно быстро, поэтому вы можете выполнять его каждый раз. Но если это (время создания соединения) действительно важно для вашего случая, вы можете рассмотреть такую вещь как сокет. С помощью сокета вы полностью контролируете жизненный цикл соединения. Недостатками этого подхода являются низкоуровневый API, и, насколько я знаю, его нужно использовать отдельно от сервлетов.