2010-11-14 2 views
1

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

У меня есть очень простой код для 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 (я проверил его). Я бы ожидал, что будет выбрано какое-то исключение или просто пустая строка для возврата.

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

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

Спасибо.

+0

Does readLine() ждет символа новой строки? Предполагается ли сервер отправлять новую строку? – Slartibartfast

+0

Спасибо. Это была одна из проблем. В качестве автора терминатора сервера терминалов используется последовательность . Оказывается, было более одной проблемы. В строке 4 мне пришлось заменить все и символы на &, но это не было решением. Кажется, что PrintWriter добавляет что-то к OutputStream, возможно, \ n персонажу или что-то подобное. Серверу это не понравилось, и мои действия были проигнорированы. Я попробовал PrintStream вместо PrintWriter, и это сработало отлично. – bobetko

ответ

0

Конечно, вам необходимо разрешение на интернет в манифесте.

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

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

Попытка выяснить, как далеко «разговор» прогрессирует, так что вы можете выяснить, где она действительно застрять

+0

У меня был этот набор разрешений. Как я уже говорил выше, худшая часть заключалась в том, что сервер игнорировал мое сообщение и не отправлял никакого ответа. Когда мне удалось получить что-то в ответ, я смог изобразить покой. Я проверю программу tcpdump. Я никогда раньше не работал над чем-то подобным. Это было бы полезно, если бы я знал это раньше. Благодарю. – bobetko

+0

Вы решаете эту проблему, тогда вы должны указать проблему и дать resion и ответ, пожалуйста, я сталкиваюсь с той же проблемой. –

+0

Сэр пожалуйста, верните меня как можно скорее. Я жду вашего ценного ответа. –

1

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

Смежные вопросы