Запись XML Stax в ObjectOutputStream (socket.getOutputStream), получая исключение MalformedByteSequenceException - PullRequest
0 голосов
/ 11 мая 2011

Я пытаюсь отправить xml-сообщение на сервер из клиентского приложения, используя сокеты в Java, но я не знаю, как записать его в поток:

        String user = "Oscar"
        String pass = "1234"

        ObjectOutputStream oos = new ObjectOutputStream(
                socket.getOutputStream());

        // Create a XMLOutputFactory
        XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();

        // Create XMLEventWriter
        XMLEventWriter eventWriter = outputFactory
                        .createXMLEventWriter(oos);

        // Create a EventFactory
        XMLEventFactory eventFactory = XMLEventFactory.newInstance();

        XMLEvent end = eventFactory.createDTD("\n");

        // Create and write Start Tag
        eventWriter.add(eventFactory.createStartDocument());
        eventWriter.add(end);

        //Se crean los atributos del tag
        ArrayList<Attribute> attributes = new ArrayList<Attribute>();
        attributes.add(eventFactory.createAttribute("nickname", user));
        attributes.add(eventFactory.createAttribute("password", pass));

        eventWriter.add(eventFactory.createStartElement
            ("", "", "authenticate",attributes.iterator(), null));
        eventWriter.add(end);

        eventWriter.add(eventFactory.createEndElement("", "", "authenticate"));

        eventWriter.add(eventFactory.createEndDocument());

, если я буду использовать:

        eventWriter.flush();

?

если я это сделаю, это даст мне следующее исключение:

javax.xml.stream.XMLStreamException: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: недопустимый байт 1 из 1-байтовой последовательности UTF-8.

Это говорит о том, что я пишу неправильно сообщение.Тогда, каков путь записи?

Сообщение должно быть:

<?xml version="1.0" encoding="UTF-8"?>" +
<authenticate nickname="Oscar" password="1234" />

А вот код, который я использую на сервере для чтения сообщения:

//the call
this.Interpreter.readCommand(socket.getInputStream());

и

//the method
@SuppressWarnings({ "unchecked", "null" })
public void readCommand(InputStream command) {

    try {

        // Fabrica de entrada de XML
        XMLInputFactory inputFactory = XMLInputFactory.newInstance();

        // Se crea un nuevo eventReader
        XMLEventReader eventReader = inputFactory.createXMLEventReader(command);

        while (eventReader.hasNext()) {

            XMLEvent event = eventReader.nextEvent();

            if (event.isStartElement()) {

                StartElement startElement = event.asStartElement();

                // Si tenemos un comando authenticate
                if (startElement.getName().getLocalPart().equals("authenticate")) {

                    CommandAuthenticate(startElement);
                }

            }

        }

    }
    catch (XMLStreamException e) {
        e.printStackTrace();
    }
}


public void CommandAuthenticate (StartElement startElement){


    String nickname = null;
    String password = null;

    // Se leen los atributos del comando
    Iterator<Attribute> attributes = startElement
                    .getAttributes();

    while (attributes.hasNext()) {

        Attribute attribute = attributes.next();

        if (attribute.getName().toString().equals("nickname")) {

            nickname = attribute.getValue();
        }

        if (attribute.getName().toString().equals("password")) {

            password = attribute.getValue();
        }

    }

    //here i call the right method for the data received

}

Ответы [ 2 ]

1 голос
/ 11 мая 2011

не переносить поток в ObjectOutputStream.это добавляет дополнительную информацию в поток, который вам не нужен (по крайней мере, в соответствии с вашим текущим кодом).и, даже если вам это нужно, вы не сможете использовать это так.

как примечание / общее правило, настройки вашего входного потока и выходного потока обычно должны совпадать.если вам действительно нужно использовать и ObjectOutputStream по какой-либо причине, вам потребуется ObjectInputStream на другом конце, чтобы соответствовать ему.

0 голосов
/ 11 мая 2011

Не используйте ObjectOutputStream.Это для сериализации.Вы не делаете сериализацию.Просто сделайте запись XMLEventWriter непосредственно в поток сокета.Точно так же не используйте ObjectInputStream на стороне чтения.

Причина, по которой это не удается, заключается в том, что ObjectOutputStream добавляет заголовок к потоку, который душит анализатор XML.

...