2010-04-14 32 views
7

Tôi có một DataInputStream mà tôi nhận được từ một số Socket. Có cách nào để tôi có thể đặt thời gian chờ cho dis.read(...) không? Hiện nay tôi sinh ra một chủ đề mới để đọc. Trong khi chuỗi chủ đề thực hiện thread.join(timeout) để chờ trước khi ngắt. Tôi biết về nio, nhưng tôi không nghĩ rằng tôi muốn refactor nhiều vào thời điểm này. Cảm ơn.Tôi có thể đặt thời gian chờ cho chức năng read() của InputStream không?

Trả lời

14

Không có trên InputStream nói chung, nhưng bạn có thể sử dụng Socket#setSoTimeout(int) để đặt thời gian chờ cho tất cả các hoạt động đọc trên chính ổ cắm.

+1

Ah cảm ơn, tôi đã bỏ lỡ điều đó. Câu hỏi duy nhất của tôi là: lần này xuất hiện để đếm cho mỗi lần read() được gọi, có thể là nhiều lần. Có cách nào tôi có thể thiết lập toàn bộ thời gian timeout như vậy mà nó sẽ timeout nếu tổng của mỗi đọc() vượt quá thời gian chờ? – Zombies

+0

Không tự động, nhưng bạn có thể đặt thời gian chờ S0 ngắn hơn thời gian chờ thực và kiểm tra vòng lặp nếu bạn đã vượt quá tổng thời gian chạy được phép của mình. – jarnbjo

+4

Hãy cẩn thận với việc sử dụng thời gian chờ của ổ cắm và DataInputStream cùng nhau (và cũng là một BufferredInputStream). Chúng sẽ đệm hoặc đọc một số dữ liệu vào bộ nhớ tạm thời (như trong getLong()) và sau đó nếu thời gian chờ xảy ra (chờ thêm dữ liệu từ ổ cắm), bạn sẽ mất bất kỳ dữ liệu đã đọc trước đó và * không có cách nào để khôi phục * . SocketTimeoutException mở rộng InterruptedIOException, cung cấp số byte được chuyển thành công trước khi hết thời gian chờ. Với một socket thô, bạn có thể sử dụng nó để thử lại/tiếp tục (có lẽ để xóa thông điệp xấu). –

Các vấn đề liên quan