Tôi đang cố gắng tạo yêu cầu phát trực tuyến HTTP "full-duplex" bằng cách sử dụng Apache HTTPClient.Apache HTTPClient Streaming HTTP POST Request?
Trong nỗ lực đầu tiên của tôi, tôi đã cố gắng sử dụng mã yêu cầu sau đây:
URL url=new URL(/* code goes here */);
HttpPost request=new HttpPost(url.toString());
request.addHeader("Connection", "close");
PipedOutputStream requestOutput=new PipedOutputStream();
PipedInputStream requestInput=new PipedInputStream(requestOutput, DEFAULT_PIPE_SIZE);
ContentType requestContentType=getContentType();
InputStreamEntity requestEntity=new InputStreamEntity(requestInput, -1, requestContentType);
request.setEntity(requestEntity);
HttpEntity responseEntity=null;
HttpResponse response=getHttpClient().execute(request); // <-- Hanging here
try {
if(response.getStatusLine().getStatusCode() != 200)
throw new IOException("Unexpected status code: "+response.getStatusLine().getStatusCode());
responseEntity = response.getEntity();
}
finally {
if(responseEntity == null)
request.abort();
}
InputStream responseInput=responseEntity.getContent();
ContentType responseContentType;
if(responseEntity.getContentType() != null)
responseContentType = ContentType.parse(responseEntity.getContentType().getValue());
else
responseContentType = DEFAULT_CONTENT_TYPE;
Reader responseStream=decode(responseInput, responseContentType);
Writer requestStream=encode(requestOutput, getContentType());
Yêu cầu treo tại cửa sổ dòng nêu trên. Dường như mã đang cố gắng gửi toàn bộ yêu cầu trước khi nhận được phản hồi. Nhìn lại, điều này có ý nghĩa. Tuy nhiên, nó không phải là những gì tôi đã hy vọng. Thay vào đó, tôi đã hy vọng gửi tiêu đề yêu cầu với số Transfer-Encoding: chunked
, nhận tiêu đề phản hồi HTTP/1.1 200 OK
với tiêu đề Transfer-Encoding: chunked
của riêng nó và sau đó tôi sẽ có kết nối HTTP trực tuyến song công để làm việc.
Hạnh phúc, HTTPClient của tôi có một ứng dụng không đồng bộ dựa trên NIO khác với các ví dụ sử dụng tốt (như this one). Câu hỏi của tôi là:
- Tôi có giải thích hành vi HTTPClient đồng bộ đúng không? Hoặc là có một cái gì đó tôi có thể làm gì để tiếp tục sử dụng (đơn giản) đồng bộ HTTPClient theo cách tôi mô tả?
- Ứng dụng khách NIO có chờ đợi để gửi toàn bộ yêu cầu trước khi tìm kiếm phản hồi không? Hoặc tôi có thể gửi yêu cầu tăng dần và nhận được phản hồi tăng dần cùng một lúc không?
Nếu HTTPClient không hỗ trợ phương thức này, có thư viện máy khách HTTP khác sẽ không? Hoặc tôi có nên lập kế hoạch viết một HTTP client (tối thiểu) để hỗ trợ phương thức này không?
Đây là những điểm tốt. Tôi chỉ chấp nhận 200 vì tôi đang ở chế độ thử nghiệm; bạn nói đúng là tôi nên chấp nhận 2XX để thành công. Tuy nhiên, đối với điểm thứ hai, toàn bộ mục đích của việc thực hiện là nhận và xử lý phản hồi theo thời gian. – sigpwned
Đây không phải là lý do khiến chương trình bị treo. Đó là do luồng đầu vào đường ống. –