gpt4 book ai didi

http - 在 Servlet 中发送和接收二进制数据

转载 作者:可可西里 更新时间:2023-11-01 15:11:00 27 4
gpt4 key购买 nike

我正在尝试使用 HttpServletRequest.getOutputStream()HttpServletResponse.getInputStream() 编写一个 Java Servlet 来接收二进制数据请求并回复它们。这是针对一个项目,该项目涉及让 Silverlight 客户端发送请求,此 servlet 通过 HTTP POST 连接响应该请求。目前,为了测试 Servlet,我用 Java 实现了一个客户端,我对它比 Silverlight 更熟悉。

问题是,在我的测试项目中,我从 Servlet 客户端发送数据作为字节数组,并期望接收到具有相同长度的字节数组——但事实并非如此,相反我得到了一个字节。因此,我在这里发布了相关的代码片段,希望您能指出我做错的地方,并希望提供相关的引用书目以进一步帮助我。

就这样吧。

客户端 servlet 处理来自一个非常简单的 HTML 页面的 POST 请求,该页面带有我用作前端的表单。我不太担心使用 JSP 等,相反我专注于使 Servlet 间通信工作

// client HttpServlet invokes this method from doPost(request,response)
private void process(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String firstName = (String) request.getParameter("firstname");
String lastName = (String) request.getParameter("lastname");
String xmlRequest = "<MyRequest><Person><Name Firstname=\""+firstName+"\" Lastname=\""+lastName+"\" /></Person></MyRequest>";

OutputStream writer = null;
InputStream reader = null;
try {
URL url = new URL("http://localhost:8080/project/Server");
URLConnection conn = url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);

writer = conn.getOutputStream();
byte[] baXml = xmlRequest.getBytes("UTF-8");
writer.write(baXml, 0,baXml.length);
writer.flush();
// perhaps I should be waiting here? how?

reader = conn.getInputStream();
int available = reader.available();
byte[] data = new byte[available];
reader.read(data,0,available);
String xmlResponse = new String(data,"UTF-8");

PrintWriter print = response.getWriter();
print.write("<html><body>Response:<br/><pre>");
print.write(xmlResponse);
print.write("</pre></body></html>");
print.close();

} finally {
if(writer!=null)
writer.close();
if(reader!=null)
reader.close();
}
}

服务器 servlet 处理 HTTP POST 请求。这是通过接收来自客户端 Servlet 的请求来完成的,用于上述测试目的,但将来我打算将它用于其他语言(特别是 Silverlight)的客户端。

// server HttpServlet invokes this method from doPost(request,response)
private void process(HttpServletRequest request, HttpServetResponse response)
throws ServletException, IOException {
ServletInputStream sis = null;
try {
sis = request.getInputStream();
// maybe I should be using a BufferedInputStream
// instead of the InputStream directly?
int available = sis.available();
byte[] input = new byte[available];
int readBytes = sis.read(input,0,available);
if(readBytes!=available) {
throw new ServletException("Oops! readBytes!=availableBytes");
}

// I ONLY GET 1 BYTE OF DATA !!!
// It's the first byte of the client message, a '<'.
String msg = "Read "+readBytes+" bytes of "
+available+" available from request InputStream.";
System.err.println("Server.process(HttpServletRequest,HttpServletResponse): "+msg);
String xmlReply = "<Reply><Message>"+msg+"</Message></Reply>";
byte[] data = xmlReply.getBytes("UTF-8");
ServletOutputStream sos = response.getOutputStream();
sos.write(data, 0,data.length);
sos.flush();
sos.close();

} finally {
if(sis!=null)
sis.close();
}
}

到目前为止,我一直坚持使用字节数组而不是使用 BufferInputStream,因为我还没有决定是否要使用例如用于传输数据的 Base64 编码字符串,或者如果我将按原样发送二进制数据。

提前致谢。

最佳答案

使用标准方式将输入流复制到输出流:

InputStream is=request.getInputStream();
OutputStream os=response.getOutputStream();
byte[] buf = new byte[1000];
for (int nChunk = is.read(buf); nChunk!=-1; nChunk = is.read(buf))
{
os.write(buf, 0, nChunk);
}

关于http - 在 Servlet 中发送和接收二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5180375/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com