通过telnet和socket发送xml的问题

时间:2011-06-23 03:56:01

标签: java xml console io socket.io

所以,我通过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();
    }
}

2 个答案:

答案 0 :(得分:0)

摆脱in.available()测试。它没有任何用处。只需解析套接字输入。它会在没有输入时阻塞。 in.available()测试也阻止您检测EOS。

此外,我没有看到任何将“完整”设置为“真实”的内容。我不知道这个循环是什么:你期待&gt;每个连接1个XML文档?如果没有,请删除循环并确保客户端在发送文档时关闭套接字。如果您期望&gt;每个发送1个XML文档您的程序似乎正常工作。我不认为你已经完全决定它是什么。

答案 1 :(得分:0)

我解决了我的问题。在客户端,我发送没有结束符号的数据。所以我只在命令结尾添加'\ n'。 这是值得解决的,我认为我知道如何做得更好。我应该将我的xml文档包装在标记和发送/响应数据中,直到我得到标记