Я пишу приложение на Android, и я хочу, чтобы он мог знать, когда сервер (который я написал на C) умирает или выключается. Я пытаюсь реализовать это, когда сервер отправляет сообщение клиенту (приложение Android) с заданным интервалом. Если это сообщение не приходит, клиент знает, что он больше не подключен к серверу. Они обмениваются данными через TCP-сокеты.
Моя проблема в том, что приложение Android не может читать то, что пишет сервер. Когда он попадает в первую часть кода, где он пытается читать из сокета сервера, он просто зависает. В приложении Android я использую BufferedReader для чтения из сокета tmpstr = inFromServer.readLine();
где tmpstr - строка, а inFromServer - BufferedReader, а сервер C просто использует write write(newsockfd,"I got your message",18);
,
Я также попытался использовать альтернативный Java-сервер, чтобы проверить, была ли неправильная моя основная логика программы. На тестовом сервере использовался PrintWriter, и он отлично работал с клиентом Android.
Что мне здесь не хватает? Есть ли разница в том, как Java и C буфер (или не буферизуют) их данные? Если мне нужно предоставить дополнительную информацию, пожалуйста, дайте мне знать.
Изменение: у меня также нет проблем с получением сервера C для чтения данных, отправленных с клиента. У меня только проблемы с получением клиентом данных, которые отправляются с сервера.
Изменение: проблема была устранена добавлением символа новой строки (\n
) к тому, что сервер отправляет клиенту.
Если я правильно помню, readLine() не вернет результат, пока не прочитает полную строку. Он будет блокироваться до тех пор. Вы не отправляете полную строку из программы C.
Вы не только не отправляете полную строку (\n завершаете), но также не отправляете всю свою строку C, так как вы не отправляете нулевой ограничитель (ваша строка C фактически содержит 19 символов, а не 18, если вы включают нулевой ограничитель). Я не помню, какой тип строкового формата использует Java, если он завершен нулем или нет, но эта часть, вероятно, не имеет значения, так как она ищет \n, а не \0.
Попробуйте отправить сообщение "Я получил ваше сообщение \n" с сервера C и сообщите нам, что произойдет потом.
К сожалению, я просто понял, что на этот вопрос уже был дан ответ в комментариях к нему. Ну что ж. Люди действительно должны публиковать ответы в качестве ответов.
"\r\n"
?