2013-07-10 86 views
0

我已經閱讀了幾篇與readLine()掛起有關的文章和問題。我不確定是否可以在服務器端(遠程位置)響應結束時手動添加NULL。據我所知,我可能無法控制它。Socket不返回NULL或 n ReadLine() - 已解決

<?xml version="1.0" encoding="utf-8"?> 
<Response> 
<Reply Status="OK" /> 
<Data attr="..." /> <-- BufferedReader hangs after this is printed. 
</Response> <--- I'm assuming this has no "\n" or "null" so it keeps waiting 
        till the socket closes 

我能做些什麼來解決這個問題?我不完全需要最後一行,但我不希望我的代碼繼續有例外。我使用Javascript,這是我的代碼的一部分。

if (socketForXML && socketForXML.isConnected()){ 
    socketForXML.setSoTimeout(60000); 
    var command = new Packages.java.lang.String(theCommand); 

    var os = socketForXML.getOutputStream(); 
    os.write(command.getBytes("UTF-8")); 
    os.flush(); 
    log.info("sendXMLCommand - sent command : " + command); 

    //RECEIVE RESPONSE FROM SERVER - in STRING format 
    var inStream = socketForXML.getInputStream(); 
    var reader = new Packages.java.io.InputStreamReader(inStream, "UTF-8"); 
    var buffer = new Packages.java.io.BufferedReader(reader); 
    while((line = buffer.readLine()) != null) { 
     log.debug(line); 
    } 
    socketForXML.close(); 

}

我使用buffer.read()也試過,它會把我所有的ASCII碼爲/響應標籤,但之後,去年>將掛爲好。我試圖做與嘗試捕捉支票,但它仍然會等到插座關閉,並曾返回任何:(。

try{ 
    if (buffer.read() < 0){ 
     log.error("END OF FILE."); 
    } 
catch(e) { 
    log.error("did not work."); 
} 

回答

0

我意識到,響應也末有空。

問題。是該InputStream未正常關閉Socket類已經呼籲了兩個方法:

isInputShutdown() < - 檢查,如果輸入流已關閉

inputShutdown() < - 關閉輸入流,使插座仍然打開

我不完全清楚爲什麼它會從閱讀中弄到緩衝區並導致它掛起,但它可能會一直嘗試流並且緩衝區已滿 - 當沒有什麼可以從輸入流接收的時候。

while((line = buffer.readLine()) != null) { 
    log.debug(line); 
    if (!inStream.isInputShutdown()){ 
      inStream.shutdownInput(); 
    } 
} 
+0

換句話說,你只想從服務器讀取一行?在那種情況下,擺脫循環。你不需要關閉任何東西。否則,這個答案沒有任何意義。 – EJP

+0

@World:這是一個自我回答。它看起來不夠糟糕,無法刪除。 –

0

的readLine()從未回報\ n和它掛起如果沒有行閱讀。實現你要找的東西的方法不是在服務器上添加一個NULL或關閉客戶端的輸入,而是在關閉服務器上的套接字將導致readLine()返回null。根據你自己的答案,很難看出爲什麼你有一個循環,如果你想要的只是一行。