2011-06-23 29 views
1

したがって、xmlのデータをソケット経由で渡します。サーバ側を走らせたら、cmdを起動して "telnet localhost 999"コマンドを実行します。この時点で新しいスレッドが開始され、このスレッドではStaxパーサーで入力ストリームを渡します。 cmdでは、単純なxmlファイル(ファイルからのコピーコピー)を入力し、このデータはサーバー側に送信され、正しく解析されます。telnetとソケット経由でxmlを送信する際の問題

問題:私のパーサーがデータを解析すると、何かを待っています。つまり、入力ストリームからのデータが正しく解析され、このデータのエンティティがいっぱいになりましたが、プログラムは次のステップに渡されません。コードここ

<?xml version="1.0" encoding="UTF-8" ?> 
<login> 
<user-name>name</user-name> 
<password>password</password> 
</login> 


@Override 
public void run() { 
    try { 
     try { 
      InputStream is = socket.getInputStream(); 
      boolean complete = false; 
      while (!complete) { 
       // handle command was received from client 
       if (is.available() == 0) { 
        continue; 
       } 
       Parser parser = new Parser(); 
       parser.parseXmlStax(is); 
       String[] commands = parser.commands; 

            // if wrong format, send number of error end exit 
       if (!checkCommands(commands)) { 
        DataOutputStream oos = new DataOutputStream(
          socket.getOutputStream()); 
        oos.writeBytes("Eror. Try again"); 
        continue; 
       } 

public void parseXmlStax(InputStream is) throws XMLStreamException, 
     IOException, ParserConfigurationException, SAXException { 
    XMLInputFactory xmlFactory = XMLInputFactory.newInstance(); 
    XMLStreamReader xmlReader = xmlFactory.createXMLStreamReader(is); 
    int type = xmlReader.getEventType(); 
    try { 
     while (true) { 
      switch (type) { 
      case XMLStreamConstants.START_DOCUMENT: 
       logger.info("Stax parsing: start document"); 
       break; 
      case XMLStreamConstants.START_ELEMENT: 
       logger.info("Stax parsing: start element"); 
       thisElement = xmlReader.getLocalName(); 
       break; 
      case XMLStreamConstants.CHARACTERS: 
       logger.info(String.valueOf("CHARACTERS")); 
       char[] ch = xmlReader.getTextCharacters(); 
       int length = xmlReader.getTextLength(); 
       int start = xmlReader.getTextStart(); 

       String command = new String(ch, start, length); 
       if (thisElement.equalsIgnoreCase(LoginItem.LOGIN)) { 
        commands[0] = thisElement; 
       } else if (!xmlReader.isWhiteSpace() 
         && thisElement 
           .equalsIgnoreCase(LoginItem.USER_NAME)) { 
        commands[1] = command; 
       } else if (!xmlReader.isWhiteSpace() 
         && thisElement.equalsIgnoreCase(LoginItem.PASSWORD)) { 
        commands[2] = command; 
       } 

       if (thisElement.equalsIgnoreCase(LoginItem.LOGOUT)) { 
        commands[0] = thisElement; 
        commands[1] = command; 
       } 

       if (thisElement.equalsIgnoreCase(LoginItem.STATUS)) { 
        commands[0] = thisElement; 
        commands[1] = command; 
       } 
       break; 
      case XMLStreamConstants.END_ELEMENT: 
       logger.info("Stax parsing: end element"); 
       break; 
      case XMLStreamConstants.END_DOCUMENT: 
       logger.info("Stax parsing: end document"); 
       break; 
      } 
      if (!xmlReader.hasNext()) { 
       break; 
      } 
      type = xmlReader.next(); 
     } 
    } finally { 
     xmlReader.close(); 
    } 
} 
+0

クライアントがデータをフラッシュしていないように見えます。 – MeBigFatGuy

+0

はい、私はクライアントを持っていません。私はインスタンス接続のためにtelnetを使い、xmlファイルをコンソールに入れます。私は教育のためにそれをする。これは私の仕事であり、私は理解できませんでした。 –

答えて

0

私は私の問題を解決しました。クライアント側では、終了記号なしでデータを送信します。だから、私はコマンドの最後に '\ n'を追加するだけです。 それは価値がある解決策であり、私はそれをより良くする方法を知っていると思います。タグを取得するまでxmlドキュメントをタグに入れて送信する必要があります。

0

;:私は閉じているCMDアプリは、次のステップ( "String []型のコマンドを=のparser.commands" ライン)に渡すため、パーサーは、XMLの最後chracterを待つように思えますin.available()テストを取り除く。それは何も役に立たない。ちょうどソケット入力を解析します。入力がない間はブロックされます。 in.available()テストでも、EOSを検出できません。

また、「完全」を「真」に設定するものは表示されません。私はこのループが何であるか分かりません。接続あたり1つ以上のXML文書が必要ですか?そうでない場合は、ループを削除して、ドキュメントを送信したときにクライアントがソケットを閉じることを確認します。 1つのXML文書が1つの送信につき> 1を超えると、プログラムが正常に動作しているように見えます。私はそれがどれであるか完全に決めたとは思わない。

+0

このin.available()テストを省略した場合、この例外が発生します:javax.xml.stream.XMLStreamException:ParseError at [row、col]:[1,1] メッセージ:コンテンツはプロローグで許可されていません。 –

+0

"接続あたり1つ以上のXMLドキュメントが必要ですか?はい、私はコンソールでxmlで複数のコマンドを送信します –

+0

@gelassen最初の文書でその例外を取得しましたか? – EJP

関連する問題