来自输入流的原始XML推送仅捕获XML的第一行

我正在尝试读取正被推送到我的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并将其保存到文件中然后处理它。其他一切都有效,但是这个。非常感谢任何帮助。     
已邀请:
我认为这里的关键是你的推送请求中的这一行:
100-continue
从HTTP / 1.1规范:   100(继续)状态(参见第10.1.1节)的目的是允许正在向请求主体发送请求消息的客户端确定源服务器是否愿意接受请求(基于请求头)在客户端发送请求主体之前。在某些情况下,如果服务器在不查看正文的情况下拒绝邮件,则客户端发送正文可能不合适或效率极低。 当您使用GlassFish(或其他一些实现HTTP标准的技术)时,该中间件将处理所有协商,以确保在请求到达您的代码时,您拥有您能够接受的所有内容。因为你在你的例子中直接从Socket读取,你和处理HTTP协商的客户端之间什么都没有,所以你只得到第一点和'100-continue'等待批准。     
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个字符放入arraylist并根据XML文件应该结束的最后部分进行检查。现在工作正常,客户(我也是)非常高兴。 :) 希望这可以帮助。 哦,最后一点。我读到JDOM可以直接实际使用输入流。我还没有测试过它,但是如果线路终端也不是问题,那么使用它会更有效率。也许其他人已经将JDOM与输入流一起使用并且遇到了线路终端问题?     

要回复问题请先登录注册