Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Exception при разборе xml


Автор: ___Yuri 8.2.2006, 19:34
Суть задачи такая:
Есть модель клиент - сервер(Java), общение происходит по средствам протокола основанного на хml,
начинается общение в двух случаях - при попытке клиента подключится или при попытке регистрации.
В первом случае все идеально проходит, а в случае регистрации вылетает, притом если даже обработчик сервера никак не реагирует на то, что было прислано вылетает сильно неприяный Exception:

sendind
<connection>
<registration nickname = "fcgha"
password="111"
name = "fgd"age = "324"
gender = "male"
email= "h">
</registration>[Fatal Error] :-1:-1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at handlerXML.IoHandler.run(IoHandler.java:39)
at java.lang.Thread.run(Thread.java:595)
runorg.xml.sax.SAXParseException: Premature end of file.


Всё начинается с попытки отправить следущую строку:
Код

Client.hndl = new ParserXML(s);         
Client.hndl.send("<connection> <registration nickname = \""+txt_nick.getText()+
                                                  "\" password=\""+txtPasswd.getText()+
                                                  "\" name = \""+txt_fname.getText()+
                                                  "\"age = \""+txt_age.getText()+
                                                  "\"gender = \""+genders+
                                                  "\" email= \""+txt_mail.getText()
                    +"\"></registration>");



Код блока обработки xml в клиенте:
Код

public class ParserXML extends IoHandler {

    public static final int PERMIT = 2;
    public static int state = 0;
    int uin;
    Sourses src = new Sourses();
    String text;
    public static final int PERMITED = -2;

    public ParserXML(Socket socket) {
        super(socket);
    }

    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println("localName" + localName);

        if (localName.equals("connection")) {
            System.out.println("lName" + localName);
            System.out.println("qName" + qName);
        }
        else if (localName.equalsIgnoreCase("registration")) {
            if (attributes.getValue("result").equalsIgnoreCase("accept")) {

            } else if (attributes.getValue("result").equalsIgnoreCase("deny")) {
                src.deny(attributes.getValue("report"));
            } else {
                System.out.println("Uncknown server Protocol: class Parser XML");
            }
        }
  etc.

    }

   




Непосредственно класс где выбрасывает:
Код

public class IoHandler extends DefaultHandler implements Runnable{
    
        private Socket socket;
        private InputStream in;
        private OutputStream out;
        private XMLReader reader;
        private Thread thread;
      
        public IoHandler(Socket socket) {
        this.socket = socket;
        thread = new Thread(this);
        try{
         
            in = socket.getInputStream();
            out = socket.getOutputStream();
            reader = XMLReaderFactory.createXMLReader();
            reader.setContentHandler(this);
            thread.start();
        } catch (Exception e){
            e.printStackTrace();
         
        }
    }

     public void run() {
        try {
            reader.parse(new InputSource(in));  //handlerXML.IoHandler.run(IoHandler.java:39)           
        } catch (Exception e) {
            e.printStackTrace();
            System.out.print("run" + e);
        }
    }
    
    public void send(String data) {
        try {
         System.out.println("sendind");
            out.write(data.getBytes());
            System.out.write(data.getBytes());
        } catch (Exception e) {
            System.out.println("send?");
            e.printStackTrace();
        }
    }
    
   ...
    
}


Откуда не понимаю - пробежался пару раз debug'ом - не помогло.
Может с кодировкой что -то? smile


Автор: LSD 8.2.2006, 21:43
Таки, что ты хочешь у тебя тег <connection> не закрывается, вот тебе парсер и выбрасывает Неожиданный конец файла. У тебя не показанно где открывается и закрывается сокет, поэтому трудно сказать в чем именно проблема.

С кодировкой у тебя могут быть траблы в этом месте: data.getBytes(). Тут используется кодировка системы по умолчанию, если на системах она будет различаться, косяков не избежать.

Автор: ___Yuri 9.2.2006, 18:14
Тестю на localhost -> система одна -> кодировка одна -> здесь сомнительно, что есть баг.
Тег сonnection не закрывается так как цикл общения ещё не закончен.
Если даже дело в нем, то почему он не ждет окончания всего xml?
Добавлено @ 18:17
Тему в данном форуме я не дублировал - просто спросил тоже на подфоруме любителей xml - а её переместили

Автор: LSD 9.2.2006, 18:32
Цитата(___Yuri @ 9.2.2006, 18:14 Найти цитируемый пост)
Тег сonnection не закрывается так как цикл общения ещё не закончен.
Если даже дело в нем, то почему он не ждет окончания всего xml?

Должен ждать до закрытия сокета. Если можешь дай тестовый примерчик с данной проблемой или хотя бы код где открываешь и закрываешь сокет.

Цитата(___Yuri @ 9.2.2006, 18:14 Найти цитируемый пост)
Тему в данном форуме я не дублировал - просто спросил тоже на подфоруме любителей xml - а её переместили

Я именно об этом и говорил. Я захожу туда и сюда, и где мне отвечать? А переместили ее по моей просьбе, т.к. тут явно проблема с Java.

Автор: LSD 9.2.2006, 23:47
Вот работающий примерчик:

Сервер:
Код
package xml.net;

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.*;
import java.io.IOException;
import java.net.*;

public class XMLServer
{
  public static final int PORT = 7892;

  public static void main(String[] args) throws Exception
  {
    ServerSocket serverSocket = new ServerSocket(PORT);
    while(true)
    {
      Socket socket = serverSocket.accept();
      System.out.println("Client from " + socket.getRemoteSocketAddress() + " connected");
      new XMLNetParser(socket);
    }
  }

  private static class XMLNetParser extends DefaultHandler implements Runnable
  {
    private Socket socket;

    public XMLNetParser(Socket socket)
    {
      this.socket = socket;
      Thread thread = new Thread(this, "XMLSocketListener");
      thread.start();
    }

    public void startDocument() throws SAXException
    {
      System.out.println("Document start");
    }

    public void endDocument() throws SAXException
    {
      System.out.println("Document end");
    }

    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
    {
      System.out.println("element '" + qName + "' start");
    }

    public void endElement(String uri, String localName, String qName) throws SAXException
    {
      System.out.println("element '" + qName + "' end");
    }

    public void characters(char ch[], int start, int length) throws SAXException
    {
      String str = new String(ch, start, length).trim();
      System.out.println('"' + str + '"');
    }

    public void warning(SAXParseException e) throws SAXException
    {
      System.err.println("WARNING: " + e);
    }

    public void error(SAXParseException e) throws SAXException
    {
      System.err.println("ERROR: " + e);
    }

    public void fatalError(SAXParseException e) throws SAXException
    {
      System.err.println("FATAL ERROR: " + e);
    }

    public void run()
    {
      try
      {
        System.out.println("Starting parsing...");
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        parser.parse(socket.getInputStream(), this);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
      try
      {
        socket.close();
      }
      catch(IOException e)
      {
      }
      System.out.println("Connection to " + socket.getRemoteSocketAddress() + " closed");
      socket = null;
    }
  }
}


Клиент:
Код
package xml.net;

import java.io.*;
import java.net.Socket;

public class XMLClent
{
  public static void main(String[] args)
  {
    Socket socket = null;
    try
    {
      socket = new Socket("localhost", XMLServer.PORT);
      Writer writer = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");
      writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
      writer.write("<root>\n");
      for(int i = 1; i <= 5; i++)
      {
        writeNode(writer, "Iteration " + i);
        writer.flush();
        Thread.sleep(10 * 1000);
      }
      writer.write("</root>\n");
      writer.flush();
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
    try
    {
      if(socket != null)
        socket.close();
    }
    catch(IOException e)
    {
    }
  }

  private static void writeNode(Writer writer, String text) throws IOException
  {
    writer.write("  <node>");
    writer.write(text);
    writer.write("</node>\n");
  }
}

Автор: ___Yuri 11.2.2006, 15:42
Ага. Спасибо, кажись понялsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)