HttpURLConnection:客户端和服务器如何保持同步

时间:2015-02-01 15:48:45

标签: java servlets httpurlconnection

我正在使用HttpURLConnection,我对客户端和服务器如何同步有一个问题。假设简单的下载文件示例。此示例将从Web复制到某处。我只使用代码来陈述标准流程。

Servlet代码如下:

   response.setContentType(mimeType);
   response.setContentLength((int) downloadFile.length());

   String headerKey = "Content-Disposition";
   String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName());
   response.setHeader(headerKey, headerValue);

    // obtains response's output stream
   OutputStream outStream = response.getOutputStream();
    //write to stream
    //close the stream

客户端代码如下:

HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
int responseCode = httpConn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
    String disposition = httpConn.getHeaderField("Content-Disposition");
    String contentType = httpConn.getContentType();
    int contentLength = httpConn.getContentLength();
    //parse content-disposition
    ....
    InputStream inputStream = httpConn.getInputStream();
    String saveFilePath = saveDir + File.separator + fileName;

    // opens an output stream to save into file
    FileOutputStream outputStream = new FileOutputStream(saveFilePath);
    //write to stream
    //close stream
} else {
    //if non Ok status
}

我的第一个问题是:httConn.getResponseCode()是否阻塞调用等待servlet完成处理?否则,如果出现错误或servlet调用response.sendError(),当你在if (responseCode == HttpURLConnection.HTTP_OK) {内时,会发生什么。

第二个问题:是第一个问题的延伸。如果responseCode没有阻塞,那么当我访问disposition,contentType,cotentLength时,我如何确定它们已经被设置。

第三个问题。如果httConn.getResponseCode()被阻止。因此,如果我想向客户端发送一些消息,那么在响应标头中将其发送到客户端是多么正确,如:resposnse.setHeader("my-message", "some message I want to send");而不是使用response.getWriter()写入流。所以我相信客户肯定会读到它。

第四个问题:如果我在servlet上写两个对象流,客户端将如何区分或区分?假设我正在使用response.getObjectOutputStream()编写一个类对象,然后我可能正在使用writer编写一些字符串,或者之后可能会编写一个文件。客户端可以区分流中的这些不同项目,还是我必须使用多个请求。每个对象或文件一个请求或要从流中读取的字符串。

1 个答案:

答案 0 :(得分:2)

  1. 是的,因为the javadoc表示
  2.   

    从HTTP响应消息中获取状态代码。例如,在以下状态行的情况下:

    HTTP/1.0 200 OK
    HTTP/1.0 401 Unauthorized
    
         

    它将分别返回200和401。如果无法从响应中识别出代码,则返回-1(即,响应不是有效的HTTP)。

    1. NA

    2. 如果需要,您可以使用标题,但标题仅限于文本且长度有限(AFAIR)。响应主体通常用于包含......响应主体。而标题通常用于元数据。

    3. 服务器和客户端必须就协议达成一致。如果协议是响应包含两个对象,则客户端应该读取两个对象。我不会这样做。您最好按顺序发送一个唯一的容器对象而不是2。 HTTP可用于传输任何内容,但JSON或XML文档通常用于传输结构化数据。