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

readLine()は \n を返さず、読み取る行がない場合はハングします。あなたが探しているものを達成する方法は、サーバーで「NULLを追加」したり、クライアントで入力をシャットダウンしたりすることではなく、サーバーでソケットを閉じることです。これにより、readLine() が null を返します。あなた自身の答えによると、必要なのが1行だけの場合、ループがある理由を理解するのは困難です。

于 2013-07-10T23:04:16.173 に答える
0

応答 DID の最後に null があることに気付きました。

問題は、inputStream が適切にシャットダウンされなかったことです。Socket クラスには、次の 2 つのメソッドがあります。

isInputShutdown() <- 入力ストリームがシャットダウンされているかどうかを確認する

inputShutdown() <-- 入力ストリームを閉じ、ソケットを開いたままにする

バッファの読み取りが失敗してハングする理由については完全には明らかではありませんが、入力ストリームから受信するものが何も残っていないときに、ストリームを試行し続け、バッファがいっぱいになった可能性があります。

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