2013-04-09 20 views
7

phiên bản máy chủ của tôi là như sau trên máy tính của tôi dev:Setting setChunkedStreamingMode trong HttpURLConnection thất bại trong việc cung cấp dữ liệu đến máy chủ

Apache/2.2.21 (Win32) mod_fcgid/2.3.6

tôi đã thử nghiệm HttpURLConnection vì dự án của tôi yêu cầu capabilties phát trực tuyến dễ dàng. Tôi đã đọc một bản tóm tắt tuyệt vời từ @BalusC về cách sử dụng lớp học.

Using java.net.URLConnection to fire and handle HTTP requests

Vấn đề Tôi hiện đang có là khi thiết setChunkedStreamingMode. Bất kể những gì tôi đặt nó là luồng của tôi dường như không chuyển sang máy chủ luồng dữ liệu trống khi phương thức/kết nối máy chủ api của tôi được gọi/thực hiện. Tuy nhiên, nếu tôi loại bỏ nó, nó hoạt động tốt.

Tôi đã thấy một người khác với một vấn đề tương tự:

Java/Android HttpURLConnection setChunkedStreamingMode not working with all PHP servers

Nhưng không có độ phân giải thực. Tôi không thể đặt nó thành setFixedLengthStreamingMode đơn giản chỉ vì nội dung (json) có độ dài thay đổi.

Điều này KHÔNG PHẢI. Tôi có khả năng sẽ chuyển một lượng lớn dữ liệu và do đó không thể lưu trữ dữ liệu trong bộ nhớ.

Câu hỏi của tôi là, làm thế nào tôi có thể nhận setChunkedStreamingMode để phát tốt? Nó có phải là một vấn đề thiết lập máy chủ hoặc nó có thể được sửa trong mã?

EDIT Tôi hiện đã kiểm tra mã trên máy chủ sản xuất của mình và nó không hoạt động. Tuy nhiên tôi vẫn muốn biết tại sao máy chủ Apache của tôi trên máy cục bộ của tôi bị lỗi. Bất kỳ trợ giúp vẫn được nhiều đánh giá cao.

+0

Xác định "dường như không làm cho nó". – EJP

+0

@EJP Bạn hoàn toàn đúng thực sự là một cụm từ không tốt. Trong thực tế nó làm cho nó vào máy chủ tuy nhiên, không có dữ liệu nào. So với việc xóa 'setChunkedStreamingMode' và dữ liệu của tôi đi qua. Không có lỗi nào, theo như tôi thấy. – HGPB

+0

Cảm ơn bạn, bây giờ xác định "dòng dữ liệu trống". Khi đo như thế nào? – EJP

Trả lời

1

Hãy thử thêm tiêu đề HTTP này:

urlConnection.setRequestHeader("Transfer-Encoding","chunked"); 

tôi haved một vấn đề như thế này: mặc dù tôi haved thiết lập các chế độ chunked HTTP truyền trực tuyến (urlConnection.setChunkedStreamingMode (0)), nó không có tác dụng, nhưng đặt HTTP tiêu đề ở trên nó hoạt động tốt.

+7

Cảm ơn bạn đã trả lời, điều này có tác dụng tương tự như thiết lập 'setChunkedStreamingMode'. Không nhận được dữ liệu. Thực sự rất kỳ quặc thực sự. Tôi đã thử điều này rồi. Ngoài ra tôi nghĩ rằng câu trả lời của bạn nên đọc: 'urlConnection.setRequestProperty (" Transfer-Encoding "," chunked ")'. – HGPB

+1

Thật khó để tin rằng những gì bạn mô tả thực sự giải quyết vấn đề của bạn. 'HttpURLConnection' đặt chính tiêu đề đó khi cần thiết. – EJP

0

Tôi gặp sự cố tương tự. Trong trường hợp của tôi, đó là hệ thống máy khách đã cài đặt một máy quét vi-rút. Những máy quét đôi khi có các mô-đun đánh cắp nhận dạng đánh chặn POST s, quét cơ thể và sau đó truyền nó lên.

Trong trường hợp của tôi BitDefender được lưu trong bộ nhớ cache khoảng 5MB trước khi chuyển.

Nếu toàn bộ trọng tải nhỏ hơn thì POST được phân phối dưới dạng yêu cầu độ dài cố định không chunked.

0

Tôi gặp sự cố tương tự khi sử dụng HttpURLConnection.Chỉ cần thêm:

conn.setRequestProperty("connection", "close"); // disables Keep Alive 

để kết nối của bạn hoặc vô hiệu hóa nó cho tất cả các kết nối:

System.setProperty("http.keepAlive", "false"); 

Từ API về ngắt kết nối():

phiên bản kết nối này để các nguồn lực của nó có thể hoặc được tái sử dụng hoặc đóng cửa. Không giống như các triển khai Java khác, điều này sẽ không nhất thiết phải đóng các kết nối ổ cắm có thể được sử dụng lại. Bạn có thể vô hiệu hóa tất cả việc tái sử dụng kết nối bằng cách đặt thuộc tính hệ thống http.keepAlive thành false trước khi đưa ra bất kỳ yêu cầu HTTP nào.