2010-07-19 45 views
0

我正在使用UNIX套接字來促進與Android設備之間的系統級守護進程之間的通信我已經在C中運行了一個應用程序,我已經在Java中運行。我比Java編碼器更像C編碼器,所以我在嘗試從Java端的套接字讀取數據時遇到了一些問題。目前,我的代碼如下:確定LocalSocket讀取大小

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

如果協議需要換行符,那麼您的impl是合適的。該代碼應該被阻塞,直到讀取換行符。你還能等什麼?

當然,通常你不想永遠等待,你需要暫停。看到Socket.setSoTimeout()

如果換行並不一定是由服務器提供的,你只是想盡快獲得讀取任何數據,使用InputStream.read()

+0

謝謝! 我很好奇的另一件事 - 我只注意到InputStream類的available()函數。結合read()給我 while(is.available()!= 0) str + =(char)is.read(); return str; 這似乎工作,但在available()的描述中的「估計」這個詞讓我有些不知所措 - 如何可靠()? – 2010-07-19 21:21:33

+0

available()== 0並不意味着流結束。 read()== - 1確實意味着。你不會需要可用的()。 – irreputable 2010-07-19 21:41:02

+0

你確定read()== -1是UNIX套接字的流結束嗎?我目前的片段是 int readByte = is.read(); while(readByte!= -1)str + =(char)readByte; readByte = is.read(); } 但這看起來在讀取-1之前超時。至少,我假設它是超時 - 實際發生的情況是我的應用程序乾淨地回到主屏幕,並在所有地方記錄嘔吐物輸出。具體來說,它拋出一個LocalSocket正在調用的JNI方法的異常,然後是一個巨大的堆棧跟蹤,Dalvik中止以及大量的內存地址映射信息。 – 2010-07-19 22:00:37