проблема с отправкой xml через telnet и сокет - PullRequest
1 голос
/ 23 июня 2011

Итак, я передаю данные в 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 голосов
/ 27 июля 2011

Я решил свою проблему. На стороне клиента я отправляю данные без символа конца. Поэтому я только добавляю '\ n' в конец своей команды. Это решение стоит, и я думаю, что знаю, как это сделать лучше. Я должен завернуть свой XML-документ в тег и отправлять / получать данные, пока не получу тег

0 голосов
/ 23 июня 2011

Избавьтесь от теста in.available (). Ничего полезного не делает. Просто разберите вход сокета. Он будет блокироваться, пока нет ввода. Тест in.available () также не позволяет вам обнаружить EOS.

Также я не вижу ничего, что устанавливало бы 'complete' в 'true'. Я не знаю, для чего этот цикл: вы ожидаете> 1 XML-документ на соединение? Если нет, удалите цикл и убедитесь, что клиент закрывает сокет после отправки документа. Если вы ожидаете> 1 XML-документа за отправку, ваша программа работает правильно. Я не думаю, что вы полностью решили, что это такое.

...