套接字不返回NULL或\ n为ReadLine()

时间:2013-07-10 13:59:11

标签: javascript sockets bufferedreader readline

我已经阅读了几篇与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码,但是在最后一次&gt;之后它也会挂起。我尝试使用try catch进行检查,但它仍会等到套接字关闭后才会返回任何内容:(。

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

2 个答案:

答案 0 :(得分:0)

我意识到响应DID在结尾处为空。

问题是inputStream未正确关闭。 Socket类有两个叫做的方法:

isInputShutdown()&lt; - 检查输入流是否已关闭

inputShutdown()&lt; - 关闭输入流,让套接字保持打开状态

我并不完全清楚为什么它会将缓冲区从读取中移除并导致它挂起但是它可能会继续尝试流并且缓冲区已满 - 当没有任何东西可以从输入流接收时。

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

答案 1 :(得分:0)

readLine()从不返回\ n,如果没有要读取的行,它会挂起。实现所需内容的方法不是在服务器上“添加NULL”或关闭客户端的输入,而是在服务器上关闭套接字会导致readLine()返回null。根据你自己的答案,很难看出为什么你有一个循环,如果你想要的只是一行。