Java - неблокирующий SocketChannel для управления устройством, общий подход - PullRequest
0 голосов
/ 20 января 2020

Я ищу хороший способ управления внешним устройством через интерфейс TCP / IP. Устройство управляется строками команд и отвечает строками. Помимо ответа на прямые команды, он также постоянно выводит данные в виде строк. Я хотел бы иметь это устройство управления только в одном потоке для записи команд в сокет и чтения данных из сокета.

Иногда устройство не выводит данные. Таким образом, блокировка read () в моем сокете для устройства блокирует вышеупомянутый поток. В этом случае я не смог бы отправить команду на устройство, потому что поток заблокирован в read ().

Я начал использовать SocketChannel, потому что я могу установить этот тип связи на неблокирующий режим . Теперь это работает нормально, за исключением того факта, что в моем l oop при опросе данных с помощью read () нагрузка на систему резко возрастает из-за того, что опрос l oop явно нагружает систему. Я считаю, что не очень элегантно помещать спящий поток после каждой операции read (), чтобы поддерживать низкую загрузку системы.

Я также обнаружил, что могу установить SO_TIMEOUT значение для read () на простых объектах Socket. Но, используя это, я должен был бы использовать выброшенное исключение тайм-аута как обычный программный поток, который, на мой взгляд, не очень элегантен, ни ... Особенно потому, что в этом приложении это нормальное условие, чтобы иметь возможность слушать ответы от устройство и одновременная отправка команд.

Каков наилучший подход для выполнения задачи? Есть ли еще одна возможность, которую я еще не понял?

Спасибо, Maik

...