【问题标题】:Socket not returning NULL or \n for ReadLine()套接字不为 ReadLine() 返回 NULL 或 \n
【发布时间】:2013-07-10 13:59:10
【问题描述】:

我已经阅读了几篇与 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.");
}

【问题讨论】:

    标签: javascript sockets bufferedreader readline


    【解决方案1】:

    我意识到响应的末尾确实有一个空值。

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

    isInputShutdown()

    inputShutdown()

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

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

    【讨论】:

    • 也就是说你只想从服务器读取一行?在这种情况下,只需摆脱循环。你不需要关闭任何东西。否则这个答案没有任何意义。
    • @World:这是一个自我回答。删除它看起来还不够糟糕。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-04-20
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多