当servlet接收xml数据时,出现错误

时间:2013-06-20 06:21:21

标签: java xml dom servlets

servelt代码

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控制台     ================的servlet ==================     接收数据===     响应日期===测试

客户端控制台

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

我的问题是servlet无法从客户端

接收数据 谁能帮助我?

2 个答案:

答案 0 :(得分:4)

  

我的问题是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而不是将其作为原始文本处理

答案 1 :(得分:0)

截至目前,我可以看到int b的值为0,因此它不会从输入流中读取任何数据。

根据this documentation

available
对于已经扩展的InputStream,

将始终返回0 ServletInputStream。 正如Jon或者所说 修改

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