Проблема с TCP - зависает при чтении ответа сервера - PullRequest
1 голос
/ 14 ноября 2010

Я пытаюсь написать клиент для Android, который должен взаимодействовать с приложением сервера ПК в локальной сети.Серверное приложение написано моим другом на C #.В настоящее время есть приложение для iPhone, которое без проблем использует это серверное приложение.

У меня очень простой код для TCP-клиента:

1. Socket s = new Socket(server, port);
2. OutputStream out = s.getOutputStream(); 
3. PrintWriter output = new PrintWriter(out); 
4. output.println("ACTION=Next&VALUE=0&"); 
5. BufferedReader input = new BufferedReader(new nputStreamReader(s.getInputStream())); 
6. String st = input.readLine(); 

Я просмотрел много примеров реализации TCP, и все они похожи.Очень похоже на мой код выше.Мое приложение зависает в строке 6, когда я пытаюсь прочитать ответ с сервера.Это не вызывает никаких ошибок (без исключений), ничего не показывает в отладчике, только ошибка тайм-аута через некоторое время.Сервер должен вернуть строку после выполнения моего действия в строке 4. Я не понимаю, почему этот код зависает.Вход не NULL (я проверял это).Я ожидаю, что будет выдано какое-то исключение или просто будет возвращена пустая строка.

Так?Что мне не хватает?Может ли быть проблема с некоторыми специальными символами, которые отправляет серверное приложение, и Android не может справиться с этим?Нужно ли какое-либо специальное разрешение в моем манифесте?

Я уверен, что у меня правильный IP-адрес и правильный номер порта.Я вижу это на сервере, работающем на моем ПК.

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 июня 2011

String st = input.readLine ();Эта команда заставляет программу ждать, пока что-то читается, или она просто берет все, что находится в буфере.Я думаю, вам нужно будет постоянно проверять, не пришло ли что-то с сервера.Я имею в виду, вам нужен один бесконечный цикл, что-то вроде While (True){ st = input.readLine(); Это проверит, если что-нибудь произошло все время.Если вы не используете его и если String st = input.readLine ();Команда не заставляет программу ждать, тогда ваш код завершится без всяких действий.

0 голосов
/ 15 ноября 2010

В манифесте вам, конечно, нужно разрешение на интернет.

Если бы это был я, я бы добавил инструментарий на сервер, чтобы он мог сообщать вам, когда было установлено соединение, когда это соединение получило данные и когда был отправлен ответ. Или запустите tcpdump на сервере.

Вы также можете временно попытаться перехватить вводимый символ за символом, а не целую строку за раз.

Попытайтесь выяснить, как далеко продвигается "разговор", чтобы вы могли выяснить, где он действительно застревает

...