Отправить данные сервлету через несколько интервалов времени - PullRequest
0 голосов
/ 30 июня 2018

Я хочу создать сервлет, в который я могу отправлять данные (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 ]

0 голосов
/ 30 июня 2018

То, что вы ищете, это WebSocket .

Это протокол, который позволяет «обновить» исходное HTTP-соединение до постоянного соединения, когда клиент или сервер могут отправлять сообщения в любое время.

Это радикально отличается от стандартного веб-приложения в стиле HTTP-сервлета, поэтому вам придется изменить лот вашего приложения, чтобы справиться с ним. Но ваш сценарий использования - именно поэтому был создан Websocket.

Apache Tomcat поставляется с некоторыми примерами Websocket (как клиентскими, так и серверными), если вы хотите посмотреть, как это делается.

0 голосов
/ 30 июня 2018

Если вы хотите использовать Servlet API, вы ограничены его характером «запрос-ответ» (каждый запрос является новым соединением). Обычно создание HTTP-запроса не составляет особого труда, он выполняется довольно быстро, поэтому вы можете выполнять его каждый раз. Но если оно (время создания соединения) действительно важно для вашего случая, вы можете рассмотреть такую ​​вещь как сокет. С помощью сокета вы полностью контролируете жизненный цикл соединения. Недостатками этого подхода являются низкоуровневый API, и, насколько мне известно, его нужно использовать отдельно от сервлетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...