【问题标题】:problem with sending xml via telnet and socket通过 telnet 和套接字发送 xml 的问题
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 如果我省略了这个 in.available() 测试,我会发现这个异常:javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] Message: Content is not allowed在序言中。
  • "您希望每个连接有 > 1 个 XML 文档吗?"是的,我通过控制台在 xml 中发送多个命令
  • @gelassen 您是在第一个文档还是第二个文档中发现异常?
  • 第一。现在我尝试只传递一个 xml 文档
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2011-03-02
    • 1970-01-01
    • 2012-08-17
    • 2018-10-06
    相关资源
    最近更新 更多