Проблема с сокетом сервера C, подключенным к клиенту Java - PullRequest
1 голос
/ 23 июня 2011

Я пишу приложение на Android и хочу, чтобы оно могло знать, когда сервер (который я написал на C) умирает или выключается.Я пытаюсь реализовать это, когда сервер отправляет сообщение клиенту (приложение Android) через определенный интервал.Если это сообщение не приходит, клиент знает, что оно больше не подключено к серверу.Они общаются с помощью TCP-сокетов.

Моя проблема в том, что приложение Android не может прочитать то, что пишет сервер.Когда он попадает в первую часть кода, где он пытается прочитать с сокета сервера, он просто зависает.В приложении для Android я использую BufferedReader для чтения из сокета tmpstr = inFromServer.readLine();, где tmpstr - строка, а inFromServer - BufferedReader, а сервер C просто использует запись write(newsockfd,"I got your message",18);.

Я также попытался использовать альтернативный Java-сервер, чтобы проверить, не ошиблась ли базовая логика моей программы.Тестовый сервер использовал PrintWriter, и он прекрасно работал с клиентом Android.

Что мне здесь не хватает?Есть ли разница в том, как Java и C буферизуют (или не буферизируют) свои данные?Если мне потребуется предоставить какую-либо дополнительную информацию, сообщите мне.

Редактировать: У меня также нет проблем с тем, чтобы сервер C мог читать данные, отправленные клиентом.У меня проблемы только с тем, чтобы клиент считывал данные, отправленные с сервера.

Редактировать: проблема была исправлена ​​добавлением символа новой строки (\n) к тому, что сервер отправляет клиенту.

1 Ответ

2 голосов
/ 23 июня 2011

Если я правильно помню, readLine () не будет возвращать результат, пока не прочитает полную строку. Это будет блокировать до тех пор. Вы не отправляете полную строку из программы на языке C.

Вы не только не отправляете полную строку (\ n прервано), но также даже не отправляете всю свою строку C, поскольку вы не отправляете нулевой терминатор (ваша строка C на самом деле содержит 19 символов, а не 18 , если вы включите нулевой терминатор). Я не помню, какой тип строкового формата использует Java, если он завершен нулем или нет, но эта часть, вероятно, не имеет значения, так как ищет \ n, а не \ 0.

Попробуйте отправить сообщение "Я получил ваше сообщение \ n" с сервера C и сообщите нам, что произойдет.

Упс, я только что понял, что на вопрос уже ответили в комментариях к нему. Ну что ж. Люди действительно должны публиковать ответы в виде ответов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...