【问题标题】:Raw XML Push from input stream captures only the first line of XML来自输入流的原始 XML 推送仅捕获 XML 的第一行
【发布时间】:2011-05-26 22:47:40
【问题描述】:

我正在尝试读取被推送到我的 java 应用程序的 XML。我最初在我的 glassfish 服务器上工作。 glassfish中的工作代码如下:

public class XMLPush implements Serializable
{    
public void processXML()
{
    StringBuilder sb = new StringBuilder();
    BufferedReader br = null;
    try
    {
        br = ((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getReader ();
        String s = null;
        while((s = br.readLine ()) != null)
        {
            sb.append ( s );
        }
          //other code to process xml
        ...........
.............................

    }catch(Exception ex)
    {
        XMLCreator.exceptionOutput ( "processXML","Exception",ex);
    }
....
.....
}//processXML
}//class

它运行良好,但我的客户无法在他们的服务器上安装 glassfish。我尝试从 php 中获取原始 xml,但无法正常工作。我决定打开一个套接字并手动监听 xml 推送。这是我接收推送的代码:

public class ListenerService extends Thread
{
private BufferedReader reader = null;
private String line;
public ListenerService ( Socket connection  )thows Exception
{
        this.reader = new BufferedReader ( new InputStreamReader ( connection.getInputStream () ) );
        this.line = null;

}//ListenerService
@Override
public void run ()
{
    try
    {
        while ( (this.line = this.reader.readLine ()) != null)
        {
            System.out.println ( this.line );
                 ........

        }//while
    }      System.out.println ( ex.toString () );
        }
    } catch ( Exception ex )
    {
        ...
    }//catch
}//run

我没有做过太多的套接字编程,但从我上周读到的内容来看,将 xml 传递给字符串是不好的。我做错了什么,为什么在 glassfish 服务器中它可以工作,而当我自己打开一个套接字时却没有?

这就是我从推送中收到的全部内容:

PUT /?XML_EXPORT_REASON=ResponseLoop&TIMESTAMP=1292559547 HTTP/1.1
Host: ************************
Accept: */*
Content-Length: 470346
Expect: 100-continue

<?xml version="1.0" encoding="UTF-8" ?>

xml 去哪儿了?是因为我将它放在一个字符串中吗?我只需要抓取 xml 并将其保存到文件中然后处理它。其他一切都有效,但这个。任何帮助将不胜感激。

【问题讨论】:

    标签: java xml sockets glassfish inputstream


    【解决方案1】:

    我认为这里的关键是您的推送请求中的这一行:

    100-continue
    

    来自 HTTP/1.1 规范:

    100(继续)状态(参见第 10.1.1 节)的目的是允许正在发送带有请求正文的请求消息的客户端确定源服务器是否愿意接受请求(基于请求标头)在客户端发送请求正文之前。在某些情况下,如果服务器在不查看正文的情况下拒绝消息,则客户端发送正文可能不合适或效率极低。

    当您使用 GlassFish(或其他一些实现 HTTP 标准的技术)时,该中间件将处理所有协商,以确保在请求到达您的代码时,您拥有能够接受的一切。因为您在示例中直接从 Socket 读取内容,所以您和处理 HTTP 协商的客户端之间没有任何关系,因此您只能得到第一个部分和“100-继续”等待批准。

    【讨论】:

    • 感谢您抽出宝贵时间回复。我发现了实际的问题。
    【解决方案2】:

    XML 的第一行有一个行终止符 (\r\n),但 XML 的其余部分没有。这就是为什么我的线程会卡住的原因。我用过

    BufferedReader reader;
    int i;
    while((i = reader.read()) != -1)
    

    并将其转换为 char:

    StringBuilder sb = new StringBuilder();
    sb.append((char)i);
    

    并将所有数据粘贴到我创建的 xml 文件中,并且能够正确执行所有操作。

    唯一的问题是我最后遇到了类似的问题,所以我必须检查我是否到达了 XML 文档的末尾。我只是将流的最后 9 个字符放入一个数组列表中,并根据 XML 文件的最后一部分进行检查。现在工作正常,客户(和我也是)非常高兴。 :) 希望这会有所帮助。

    哦,最后一点。我读到 JDOM 可以直接使用输入流。我还没有测试它,但如果线路终止也不会成为问题,那么使用起来会更有效。也许其他人已经将 JDOM 与 inputstream 一起使用并且遇到了行终止问题?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 2014-01-20
      • 1970-01-01
      • 2012-08-05
      相关资源
      最近更新 更多