确定LocalSocket读取大小

时间:2010-07-19 20:55:47

标签: java android sockets

我正在使用UNIX套接字来促进我在C中运行的系统级守护进程和我用Java运行的应用程序之间的Android设备上的通信。我更像是一个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),但是有一个非常糟糕的设计缺陷,要求服务器端套接字代码以换行符终止字符串进行响应。如果情况并非如此,世界就会结束。

我想弄清楚的是,是否有更好的方法来完成这项任务。是否有可能确定是否有任何数据等待在缓冲读取器中读取,如果是,那么该数据的大小是多少?如果没有,是否有更好的方法通过我不熟悉的Android Java端口上的UNIX套接字读取数据?

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果协议需要换行符,则您的impl是合适的。代码应该被阻止,直到读取换行符。除了等等,你还能做什么?

当然,通常你不想永远等待,你需要暂停。见Socket.setSoTimeout()

如果新行不一定由服务器提供,并且您只想尽快阅读任何数据,请使用InputStream.read()