Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Exception при разборе xml 
:(
    Опции темы
___Yuri
Дата 8.2.2006, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.3.2005
Где: МО

Репутация: нет
Всего: нет



Суть задачи такая:
Есть модель клиент - сервер(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


PM MAIL ICQ   Вверх
LSD
Дата 8.2.2006, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
___Yuri
Дата 9.2.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.3.2005
Где: МО

Репутация: нет
Всего: нет



Тестю на localhost -> система одна -> кодировка одна -> здесь сомнительно, что есть баг.
Тег сonnection не закрывается так как цикл общения ещё не закончен.
Если даже дело в нем, то почему он не ждет окончания всего xml?
Добавлено @ 18:17
Тему в данном форуме я не дублировал - просто спросил тоже на подфоруме любителей xml - а её переместили
PM MAIL ICQ   Вверх
LSD
Дата 9.2.2006, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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

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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
LSD
Дата 9.2.2006, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Вот работающий примерчик:

Сервер:
Код
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");
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
___Yuri
Дата 11.2.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.3.2005
Где: МО

Репутация: нет
Всего: нет



Ага. Спасибо, кажись понялsmile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.