Определение размера чтения LocalSocket - PullRequest
0 голосов
/ 20 июля 2010

Я использую сокет UNIX для облегчения связи на устройстве Android между демоном системного уровня, который я запускаю в C, и приложением, которое я запускаю в Java.Я гораздо больше C-кодер, чем Java-кодер, поэтому у меня возникают некоторые проблемы при попытке чтения данных из сокета на стороне Java.В настоящее время мой код выглядит следующим образом:

try{//Prepare to write the command and read the ACK
  InputStream is = receiver.getInputStream();
  OutputStream os = receiver.getOutputStream();
  BufferedReader in = new BufferedReader(new InputStreamReader(is));

  os.write(message.getBytes());

  //FIX THIS!!  The following assumes that there is a newline-
  //  terminated chunk of data waiting for us in the buffer.  If
  //  that assumption is wrong, the code will hang.  Find some way
  //  to determine if/how much data is waiting for us in the socket!
  String str = in.readLine();

  is.close();
  os.close();
  receiver.close();
     return str;
 }catch(IOException ex){
  Log.e(TAG,(ex.toString()+"\n"));
  return null;
 }

Как показывает мой комментарий, эта реализация работает (ish), но имеет очень плохой конструктивный недостаток, заключающийся в том, что код сокета на стороне сервера отвечает строкой, заканчивающейся символом новой строки,Если это не так, мир заканчивается.

То, что я пытаюсь выяснить, - есть ли более эффективные средства для выполнения этой задачи.Можно ли определить, есть ли какие-либо данные, ожидающие чтения в буферизованном считывателе, и если да, то каков размер этих данных?Если нет, то есть ли лучший способ чтения данных через сокет UNIX на стороне Java от Android, с которым я не знаком?

Заранее спасибо!

1 Ответ

0 голосов
/ 20 июля 2010

если протокол требует новой строки, ваш impl подходит.код ДОЛЖЕН быть заблокирован, пока не будет прочитана новая строка.что еще можно сделать, кроме как ждать?

конечно, обычно вы не хотите ждать вечно, вам нужен тайм-аут.смотрите Socket.setSoTimeout()

, если сервер не обязательно вводит новую строку, и вы просто хотите прочитать какие-либо данные как можно скорее, используйте InputStream.read()

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