[英]ObjectOutputStream.writeObject() (on top of socket.getOutputStream()) throws broken pipe (IO Exception) when writing a serializable object
[英]Writing Stax XML to ObjectOutputStream(socket.getOutputStream) getting MalformedByteSequenceException
我正在尝试使用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
}
不要将流包装在ObjectOutputStream中。 它会向流中添加不必要的额外信息(至少根据您当前的代码)。 而且,即使您确实需要它,也无法像这样使用它。
作为旁注/一般规则,您的输入流和输出流设置通常应该匹配。 如果由于某种原因确实需要使用和ObjectOutputStream,则需要在另一端使用ObjectInputStream进行匹配。
不要使用ObjectOutputStream。 那是为了序列化。 您没有在进行序列化。 只需让XMLEventWriter直接写入套接字的流即可。 同样,阅读侧也没有ObjectInputStream。
失败的原因是ObjectOutputStream向XML解析器所阻塞的流中添加了一个标头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.