我正在使用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套接字读取数据?
提前致谢!
答案 0 :(得分:0)
如果协议需要换行符,则您的impl是合适的。代码应该被阻止,直到读取换行符。除了等等,你还能做什么?
当然,通常你不想永远等待,你需要暂停。见Socket.setSoTimeout()
如果新行不一定由服务器提供,并且您只想尽快阅读任何数据,请使用InputStream.read()