所以,我通过socket传递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();
}
}
答案 0 :(得分:0)
摆脱in.available()测试。它没有任何用处。只需解析套接字输入。它会在没有输入时阻塞。 in.available()测试也阻止您检测EOS。
此外,我没有看到任何将“完整”设置为“真实”的内容。我不知道这个循环是什么:你期待&gt;每个连接1个XML文档?如果没有,请删除循环并确保客户端在发送文档时关闭套接字。如果您期望&gt;每个发送1个XML文档您的程序似乎正常工作。我不认为你已经完全决定它是什么。
答案 1 :(得分:0)
我解决了我的问题。在客户端,我发送没有结束符号的数据。所以我只在命令结尾添加'\ n'。 这是值得解决的,我认为我知道如何做得更好。我应该将我的xml文档包装在标记和发送/响应数据中,直到我得到标记