@DimOFF

Java. Как корректно организовать взаимодествие с сетью?

В качестве хобби делаю один проект. В процессе написания сетевой части возник вопрос. Суть следующая. Мое приложение на Java должно подключиться к серверу и ждать оттуда данные или передавать их туда (с сервера поступает команда что-то сделать или на клиенте наступает событие о котором нужно отчитаться).
Реализовано это приблизительно так
InputStreamReader isr = new InputStreamReader(client.getInputStream());
            BufferedReader in = new BufferedReader(isr);
            PrintWriter out = new PrintWriter(client.getOutputStream());
            String line;
            String msg;
            while (true) {
                if (isr.ready()) {
                    line = in.readLine();
                    if (line.startsWith("EXIT")) {
                        Logger.getLogger(Client.class.getName()).log(Level.INFO,"Exit");
                        break;                        
                    }
                    if (line.startsWith("BEGIN")) {
                        Logger.getLogger(Client.class.getName()).log(Level.INFO,"BEGIN");
                        break;                        
                    }
                } else {
                    try {
                        this.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if (! msg.isEmpty()) {
                    out.println(msg);
                }
            }
            out.close();
            in.close();
            client.close();


Есть ли возможность обойтись без this.sleep(1); и не греть воздух холостым ходом?
  • Вопрос задан
  • 136 просмотров
Пригласить эксперта
Ответы на вопрос 2
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Так или иначе, лучше использовать NIO, и проверять наличие данных через selector! Вот на почитать - www.javaportal.ru/java/articles/useselectfast.html... (ожидание входящих данных)
И откажитесь вообще от sleep - это не очень красиво.
Да, возможно, данные придется буферировать, так как они могут прийти в двух пакетах, например "BEG" и "IN"
С файлами отдельная история - наверное поможет вот это! Механизм аналогичный - https://docs.oracle.com/javase/tutorial/essential/...
Ответ написан
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Так или иначе придется проверять наличие данных (это может быть скрыто за механизмом асинхронного вызова, но суть будет та же - eventloop). Продолжительностью sleep вы можете искать баланс между скоростью отклика и занимаемыми ресурсами.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы