套接字没有为ReadLine()返回NULL或

Socket not returning NULL or for ReadLine()

本文关键字:返回 NULL ReadLine 套接字      更新时间:2023-09-26

我读了几篇与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数字,但在last>之后,它也会挂起。我试着用try-catch进行检查,但它仍然会等到套接字关闭,并且没有返回任何内容:(.

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

我意识到响应的末尾有一个null。

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

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

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

我不完全清楚为什么它会读取缓冲区并导致其挂起,但可能是它一直在尝试流式传输,而缓冲区已经满了——而输入流中没有什么可接收的了。

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

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