Я пытаюсь написать Java-программу для Windows, которая включает в себя связь с серверной программой, расположенной на чужой машине. Моя программа успешно соединяется с сервером, успешно записывает в нее массив байтов , и ждет ответа.Java-клиентский сервер, отправляющий байты, прослушивает бесконечно
Я знаю, что сервер печатает байты (ответ) обратно ко мне по одному байту за раз. Я попытался использовать объект DataInputStream с различными методами (read, readByte и т. Д.), Я попытался использовать объект BufferedReader с его методами (read, readLine и т. Д.), Но все объекты-читатели и различные методы, которые я использовал все сталкиваются с той же проблемой.
Байт успешно читается (каждый раз, когда байты или байты считываются, я могу распечатать их на консоли, и они - то, что я ожидал бы от них). Проблема в том, что мой читатель не знает, когда прекратить чтение. Даже если сервер отправил все свои байты, функция чтения на моем конце ждет больше данных, на неопределенный срок, и поэтому программа зависает при чтении.
Эта проблема, похоже, влияет на все методы, которые я пробовал. Я выполнял тесты с помощью простой клиентской программы и серверной программы, каждая длиной около 40 или 50 строк, где клиент подключается к серверу и отправляет ему несколько байтов. Все методы, которые я пробовал для считывателя сервера, приводят к той же проблеме, о которой упоминалось выше (сервер зависает, ожидая большего ввода от клиента, даже несмотря на то, что он отправил все свои данные).
Я действительно отчаянно нуждаюсь в помощи для этого. Очень важно, чтобы я скоро закончил эту программу, и она в основном завершена, за исключением этой проблемы связи. Любая помощь высоко ценится!
Роб
--EDIT--
В конце концов, я остановился на алгоритме, который завершает чтение байтов путем отслеживания числа сегментов сообщений, которые были прочитаны (сегменты ограниченное двумя нулевыми значениями: 00) и сравнивая это с количеством ожидаемых сегментов (переданных функции чтения в качестве аргумента). Это не идеальный метод, но он работает, и у меня нет времени на работу над программой.
Спасибо за помощь всем!
Вы закрываете свои потоки? – npinti
Я попытался закрыть объект записи на стороне клиента после отправки данных в тестовых программах клиент-сервер, и он сработал, но затем сервер вызвал исключение во время выполнения, заявив, что соединение было закрыто, когда он попытался создать объект DataOutputStream написать ответ клиенту. Но в реальной программе, которую я пытаюсь написать, я не контролирую то, что сервер делает или не делает. – Rob
Кроме того, отправка данных заранее не является вариантом, потому что сервер, с которым я связываюсь, этого не делает, и я не имею контроля над кодом сервера. – Rob