Проблема с сокетом сервера C, подключенным к клиенту Java

1

Я пишу приложение на 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) к тому, что сервер отправляет клиенту.

  • 1
    Не будет ли readLine ждать новой строки? Я не вижу, что вы отправляете новую строку, однако ...
  • 1
    Вы пытались отправить символы новой строки "\r\n" ?
Показать ещё 3 комментария
Теги:
tcp

1 ответ

2

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

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

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

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

  • 0
    +1 к вашему последнему предложению.
  • 0
    Спасибо за ответ в любом случае! Ваше предложение добавить "\ n" - это именно то, что я должен был сделать, чтобы это сработало ... и да, люди, дающие ответы в комментариях, немного сбивают с толку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню