【发布时间】:2011-06-23 03:56:00
【问题描述】:
所以,我通过套接字在 xml 中传递数据。当我运行服务器端时,我打开 cmd 并执行命令“telnet localhost 999”。在这一刻,新线程启动,在这个线程中,我在 Stax 解析器中传递输入流。在 cmd 上,我输入简单的 xml 文件(从文件复制过去),这些数据正在发送到服务器端并正确解析。
问题是:当我的解析器解析数据时,它会继续等待。我的意思是,输入流中的数据已正确解析,并且该数据的实体已填充,但程序未传递到下一步。似乎解析器等待 xml 的最后一个字符,因为当我关闭 cmd 应用程序传递到下一步时(行:“String[] commands = parser.commands;”)
这里代码:
<?xml version="1.0" encoding="UTF-8" ?>
<login>
<user-name>name</user-name>
<password>password</password>
</login>
@Override
public void run() {
try {
try {
InputStream is = socket.getInputStream();
boolean complete = false;
while (!complete) {
// handle command was received from client
if (is.available() == 0) {
continue;
}
Parser parser = new Parser();
parser.parseXmlStax(is);
String[] commands = parser.commands;
// if wrong format, send number of error end exit
if (!checkCommands(commands)) {
DataOutputStream oos = new DataOutputStream(
socket.getOutputStream());
oos.writeBytes("Eror. Try again");
continue;
}
public void parseXmlStax(InputStream is) throws XMLStreamException,
IOException, ParserConfigurationException, SAXException {
XMLInputFactory xmlFactory = XMLInputFactory.newInstance();
XMLStreamReader xmlReader = xmlFactory.createXMLStreamReader(is);
int type = xmlReader.getEventType();
try {
while (true) {
switch (type) {
case XMLStreamConstants.START_DOCUMENT:
logger.info("Stax parsing: start document");
break;
case XMLStreamConstants.START_ELEMENT:
logger.info("Stax parsing: start element");
thisElement = xmlReader.getLocalName();
break;
case XMLStreamConstants.CHARACTERS:
logger.info(String.valueOf("CHARACTERS"));
char[] ch = xmlReader.getTextCharacters();
int length = xmlReader.getTextLength();
int start = xmlReader.getTextStart();
String command = new String(ch, start, length);
if (thisElement.equalsIgnoreCase(LoginItem.LOGIN)) {
commands[0] = thisElement;
} else if (!xmlReader.isWhiteSpace()
&& thisElement
.equalsIgnoreCase(LoginItem.USER_NAME)) {
commands[1] = command;
} else if (!xmlReader.isWhiteSpace()
&& thisElement.equalsIgnoreCase(LoginItem.PASSWORD)) {
commands[2] = command;
}
if (thisElement.equalsIgnoreCase(LoginItem.LOGOUT)) {
commands[0] = thisElement;
commands[1] = command;
}
if (thisElement.equalsIgnoreCase(LoginItem.STATUS)) {
commands[0] = thisElement;
commands[1] = command;
}
break;
case XMLStreamConstants.END_ELEMENT:
logger.info("Stax parsing: end element");
break;
case XMLStreamConstants.END_DOCUMENT:
logger.info("Stax parsing: end document");
break;
}
if (!xmlReader.hasNext()) {
break;
}
type = xmlReader.next();
}
} finally {
xmlReader.close();
}
}
【问题讨论】:
-
客户端似乎没有刷新数据。
-
是的,但我没有客户。我使用 telnet 进行实例连接并放置 xml 文件即控制台。我这样做是为了教育。这是我的任务,我想不通。
标签: java xml console io socket.io