【问题标题】:when servlet receive xml data , there is a errorservlet 接收 xml 数据时,出现错误
【发布时间】:2013-06-16 21:25:25
【问题描述】:

服务代码

System.out.println(" ================servlet==================");
InputStream in = request.getInputStream();
int a = in.available();
byte[] b = new byte[a];
in.read(b);
String stringValue = new String(b,"utf-8");
System.out.println("receive data==="+stringValue);
OutputStream dataOut = response.getOutputStream();
String responseData = "<test>test</test>";
System.out.println("response datea==="+responseData);
dataOut.write(responseData.getBytes("utf-8"));
dataOut.flush();
dataOut.close();

客户端代码

System.out.println("================client======================");
java.net.URL url = new java.net.URL("test address");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setUseCaches(false);
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestMethod("POST");
String sendData = "<data>send</data>";
System.out.println("send data="+sendData);
OutputStream dataOut = con.getOutputStream();
dataOut.write(sendData.getBytes("utf-8"));
dataOut.flush();
dataOut.close();
InputStream in = con.getInputStream();
int a = in.available();
byte[] b = new byte[a];
in.read(b);
String stringValue = new String(b,"utf-8");
in.close();
System.out.println("receive data="+stringValue);

我得到打印结果 小服务程序控制台 ================servlet================== 接收数据=== 响应日期a===测试

客户端控制台

================client======================
send data=<data>send</data>
receive data=<test>test</test>

我的问题是 servlet 无法从客户端接收数据

谁能帮帮我?

【问题讨论】:

  • 您遇到了什么错误?
  • 那你发在这里的原因是什么。以正确的方式与人打交道很重要!!!
  • 但我可以从 request.getParamenter("") 获取数据

标签: java xml dom servlets


【解决方案1】:

我的问题是 servlet 无法从客户端接收数据

可能不是唯一的问题,但是这段代码完全坏掉了:

int a = in.available();
byte[] b = new byte[a];
in.read(b);

您假设所有数据在一开始就可用。相反,您应该从流中读取数据,直到它用完数据。鉴于您希望将结果作为文本,我会将流包装在 InputStreamReader 中并从那里读取。例如:

BufferdReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
    System.out.println("Servlet read line: " + line);
}

如果您实际上想将其读取为 XML,您应该能够将 InputStream(或 Reader)传递给 XML 解析器库以创建 DOM。

顺便说一句,您也应该在客户端代码中做同样的事情。基本上:

  • 永远不要忽略InputStream.read的返回值
  • 避免使用available();这很少适合
  • 使用InputStreamReader 从流中读取文本,而不是自己根据字节构造文本
  • 使用 XML API 读取 XML,而不是将其作为原始文本处理

【讨论】:

  • 如果我做这个文档 document = null; SAXReader 阅读器 = 新 SAXReader (); document = reader.read(new InputStreamReader(conn.getInputStream(), "UTF-8"));我得到异常 org.dom4j.DocumentException: Error on line -1 of document : Premature end of file。嵌套异常:文件过早结束。谢谢
  • @fenger:这表明数据实际上并没有到达 servlet。你为什么在客户端使用DataOutputStream?这对我来说似乎毫无意义。我建议您使用 Wireshark 来诊断网络级别发生的情况。
【解决方案2】:

到目前为止,我可以看到int b 的值是0,因此它没有从输入流中读取任何数据。

根据this documentation

available

对于 InputStream 将始终返回 0 ServletInputStream。 正如乔恩所说或 编辑:

InputStream is=request.getInputStream();
OutputStream os=response.getOutputStream();
byte[] buf = new byte[1024];
int chunk = is.read(buf);

【讨论】:

  • 那么我怎样才能得到数据呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多