2010-12-17 5 views
0

私はJavaアプリケーションにプッシュされているXMLを読み込もうとしています。私はもともとガラス張りのサーバーで働いていました。 GlassFishの中に作業コードは次のとおりです。Raw XML入力ストリームからのプッシュは、XMLの最初の行だけをキャプチャします

public class XMLPush implements Serializable 
{  
public void processXML() 
{ 
    StringBuilder sb = new StringBuilder(); 
    BufferedReader br = null; 
    try 
    { 
     br = ((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getReader(); 
     String s = null; 
     while((s = br.readLine()) != null) 
     { 
      sb.append (s); 
     } 
      //other code to process xml 
     ........... 
............................. 

    }catch(Exception ex) 
    { 
     XMLCreator.exceptionOutput ("processXML","Exception",ex); 
    } 
.... 
..... 
}//processXML 
}//class 

それは完璧に動作しますが、私のクライアントはそのサーバー上のGlassFishを持つことができません。私はPHPから生のXMLを取得しようとしたが、私はそれを動作させることができませんでした。私はソケットを開いてxmlプッシュを手動で待ち受けることにしました。ここでプッシュを受信するための私のコードです:私は多くのソケットプログラミングを行っていない

public class ListenerService extends Thread 
{ 
private BufferedReader reader = null; 
private String line; 
public ListenerService (Socket connection )thows Exception 
{ 
     this.reader = new BufferedReader (new InputStreamReader (connection.getInputStream())); 
     this.line = null; 

}//ListenerService 
@Override 
public void run() 
{ 
    try 
    { 
     while ((this.line = this.reader.readLine()) != null) 
     { 
      System.out.println (this.line); 
       ........ 

     }//while 
    }  System.out.println (ex.toString()); 
     } 
    } catch (Exception ex) 
    { 
     ... 
    }//catch 
}//run 

が、私は一週間のために読んだものから文字列にXMLを渡すことは悪いことです。私は間違って何をしているのですか?それはなぜglassfishサーバーで動作するのですか?そして、ソケットを開いただけではそれはありませんか?

これは私がプッシュから受け取ることのすべてです:XMLは行かなかった

PUT /?XML_EXPORT_REASON=ResponseLoop&TIMESTAMP=1292559547 HTTP/1.1 
Host: ************************ 
Accept: */* 
Content-Length: 470346 
Expect: 100-continue 

<?xml version="1.0" encoding="UTF-8" ?> 

?私はそれを文字列にしているからですか?私はXMLをつかんでファイルに保存してから処理する必要があります。他のすべてが動作しますが、これは助けになります。

答えて

0

XMLの最初の行には行終端文字(\ r \ n)がありますが、残りのXMLは含まれていませんでした。これが私のスレッドが詰まってしまう理由です。私は

BufferedReader reader; 
int i; 
while((i = reader.read()) != -1) 

を使用して文字にそれをキャスト:

StringBuilder sb = new StringBuilder(); 
sb.append((char)i); 

と私が作成したXMLファイルにすべてのデータをスタックし、すべてを正しく行うことができました。

私は最後に同様の問題があったので、XML文書の最後に達したかどうかを確認する必要がありました。私はストリームの最後の9文字をarraylistに入れ、XMLファイルの最後の部分と照合するだけです。今はうまく動作し、クライアント(と私も)非常に満足しています。 :) お役に立てれば。

ああ最後のメモ。私はJDOMが実際に入力ストリームを直接使用できることを読んでいます。私はまだそれをテストしていませんが、回線の終了が問題にならない場合は、それを使用する方が効率的です。誰か他の人がinputstreamでJDOMを使用していて、回線終了の問題があったのでしょうか?

0

私はここにキーは、このラインはあなたのプッシュ要求であると思う:

100-continue 

HTTPから/ 1.1仕様:

100(続行)状態の目的(セクション10.1を参照してください.1)は、要求本体を持つ要求メッセージを送信しているクライアントが、クライアントが要求本体を送信する前に、(要求ヘッダーに基づいて)要求を受け入れようとしているかどうかを判断できるようにすることです。場合によっては、サーバーが本文を見ずにメッセージを拒否すると、クライアントが本文を送信することは不適切または非常に非効率的になることがあります。あなたはGlassFishの(またはHTTP標準を実装し、いくつかの他の技術)を通過すると、そのミドルウェアは、要求があなたのコードになる時点で、あなたはあなたがことができるしているすべてのものを持っていることを確認するために、すべての交渉を処理する

受け入れるために。あなたの例ではSocketから直接読み込んでいるので、HTTPのネゴシエーションを処理するクライアントとクライアントの間に何もないので、最初の少ししか取得せず、「100-continue」を待つだけです。

+0

返信いただきありがとうございます。私は実際の問題を発見した。 – pqsk

関連する問題