0

我已经阅读了几篇与 readLine() 挂起相关的文章和问题。我不确定是否可以在服务器端的响应末尾手动添加 NULL(它是远程位置)。据我所知,我可能无法控制它。

 <?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() ,它会为我获取 /Response 标记的所有 ASCII 数字,但在最后一个 > 之后它也会挂起。我尝试使用 try catch 进行检查,但它仍然会等到套接字关闭并且没有返回任何内容:(。

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

2 回答 2

0

我意识到响应 DID 最后有一个空值。

问题是 inputStream 没有正确关闭。Socket 类有两个方法称为:

isInputShutdown() <- 检查输入流是否关闭

inputShutdown() <-- 关闭输入流,保持套接字仍然打开

我不完全清楚为什么它会破坏缓冲区的读取并导致它挂起,但它可能一直在尝试流式传输并且缓冲区已满 - 当没有任何东西可以从输入流接收时。

while( ( line = buffer.readLine() ) != null ) {
    log.debug(line);
    if ( !inStream.isInputShutdown() ){
           inStream.shutdownInput();
    }
}
于 2013-07-10T17:19:49.303 回答
0

readLine()永远不会返回 \n,如果没有要读取的行,它就会挂起。完成您正在寻找的方法不是在服务器上“添加 NULL”或关闭客户端的输入,而是关闭服务器上的套接字将导致 readLine() 返回 null。根据您自己的答案,如果您想要的只是一条线,那么很难理解为什么您有一个循环。

于 2013-07-10T23:04:16.173 回答