【问题标题】:Writing Stax XML to ObjectOutputStream(socket.getOutputStream) getting MalformedByteSequenceException将 Stax XML 写入 ObjectOutputStream(socket.getOutputStream) 得到 MalformedByteSequenceException
【发布时间】:2011-08-23 08:59:02
【问题描述】:

我正在尝试使用 Java 中的套接字从客户端应用程序向服务器发送 xml 消息,但我不知道如何将其写入流:

        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 字节 UTF-8 序列的字节 1 无效。

它说我写错了消息。那么,写法是什么?

消息应该是:

<?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

}

【问题讨论】:

    标签: java xml sockets unicode stax


    【解决方案1】:

    不要将流包装在 ObjectOutputStream 中。它正在向您不需要的流中添加额外的信息(至少,根据您当前的代码)。而且,即使你确实需要它,你也不能这样使用它。

    作为旁注/一般规则,您的输入流和输出流设置通常应该匹配。如果您出于某种原因确实需要使用 ObjectOutputStream,则需要在另一端使用 ObjectInputStream 来匹配它。

    【讨论】:

    • 你也对,但汤姆安德森先回答。无论如何感谢您的帮助
    • 实际上,我认为 jtahlborn 比我早了几秒钟。奥斯卡,有些人建议,如果你得到几个同样好的答案,你应该接受一个,然后投票给其他人。这是一种让所有答案得到认可的方式。
    • 是的,我想我是第一个,但生活还在继续。 :)
    【解决方案2】:

    不要使用 ObjectOutputStream。那是为了序列化。您没有进行序列化。只需让 XMLEventWriter 直接写入套接字的流。同样,在读取端不要有 ObjectInputStream。

    失败的原因是 ObjectOutputStream 向流中添加了一个标头,XML 解析器正在阻塞该标头。

    【讨论】:

    • 非常感谢您的帮助。
    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2016-05-31
    • 1970-01-01
    • 2019-08-15
    • 2014-04-18
    • 2016-03-10
    相关资源
    最近更新 更多