gpt4 book ai didi

java - 通过telnet和socket发送xml的问题

转载 作者:行者123 更新时间:2023-12-01 05:43:49 25 4
gpt4 key购买 nike

因此,我通过套接字以 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();
}
}

最佳答案

摆脱 in.available() 测试。它没有做任何有用的事情。只需解析套接字输入即可。当没有输入时它会阻塞。 in.available() 测试也会阻止您检测 EOS。

此外,我没有看到任何将“完整”设置为“真实”的内容。我不知道这个循环的用途:您是否期望每个连接有 > 1 个 XML 文档?如果没有,请删除循环并确保客户端在发送文档后关闭套接字。如果您期望每次发送 > 1 个 XML 文档,则您的程序似乎工作正常。我认为你还没有完全决定是哪一个。

关于java - 通过telnet和socket发送xml的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6449148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com