2012-05-22 14 views
7

Tôi đang sử dụng lớp HttpURLConnection để thực hiện các yêu cầu http. Mã của tôi trông giống như thế này-HttpURLConnection.getInputStream() chặn

while(true){ 
    try{ 
     connection=(HttpURLConnection)url.openConnection(); 
     connection.setDoOutput(true); 
     connection.setConnectTimeout(2*1000); 
     InputStream in=connection.getInputStream(); 
    } 
    catch(SocketTimeOutException e){} 
    catch(IOException e){} 
} 

Tôi thực hiện một số xử lý trên dữ liệu khi tôi truy xuất đối tượng InputStream. Vấn đề của tôi là nếu tôi để chương trình chạy đủ lâu, lệnh gọi tới các khối getInputStream và tôi không bao giờ vượt qua được điều đó.

Tôi có thiếu gì đó không? Bất kỳ gợi ý hay trợ giúp nào cũng sẽ được đánh giá cao. Cảm ơn.

+4

Không bao giờ thực hiện loại điều này 'catch (SocketTimeOutException e) {}' trong một vòng lặp 'while (true)'. Nó sẽ làm cho nó rất khó để gỡ lỗi hoặc dừng chương trình của bạn một cách duyên dáng. – artbristol

+2

@artbristol bạn đang cố gắng nói gì ... đó là từ mã sản xuất của chúng tôi :) –

+2

Ngoài việc làm như @artbristol, bạn đã thử nhận xét 'connection.setDoOutput (true)' vì điều này có nghĩa là bạn đang mong đợi bạn gọi 'connection.getOutputStream()' và viết một cái gì đó trong cơ thể Http –

Trả lời

6

Đặt thời gian đọc cho kết nối. Ngoài ra, đóng các luồng trong một khối cuối cùng khi bạn đã hoàn tất với chúng.

+0

Cảm ơn. Điều này giúp rất nhiều và hoạt động quá. – Sandman

+0

cảm ơn rất nhiều vì điều đó !!!! – jaisonDavis

1

Bạn nên đóng các kết nối không được sử dụng. Dưới đây là ví dụ:

connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setDoOutput(true); 
connection.setReadTimeout(2*1000); 
connection.connect(); 
reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
stringBuilder = new StringBuilder(); 
String line = null; 
while ((line = reader.readLine()) != null) 
{ 
stringBuilder.append(line + "\n"); 
} 
String result = stringBuilder.toString(); 
reader.close(); 
+0

Cảm ơn rất nhiều phản hồi của bạn. Thiết lập thời gian đọc trên kết nối dường như sửa nó! Rất cảm kích sự giúp đỡ của bạn. – Sandman

+0

NHẬN với setDoOutput (true) không hoạt động tốt với nhau. – zgulser