2011-09-09 20 views
86

Tôi đang gặp sự cố với thư viện mà tôi đang sử dụng, đó có thể là thư viện hoặc có thể do tôi sử dụng sai!ConnectionTimeout so với SocketTimeout

Về cơ bản khi tôi làm điều này (Timeout trong mili giây)

_ignitedHttp.setConnectionTimeout(1); // v short 
_ignitedHttp.setSocketTimeout(60000); // 60 seconds 

Không timeout ngoại lệ được tạo ra tác phẩm ok, tuy nhiên, khi tôi làm điều này:

_ignitedHttp.setConnectionTimeout(60000); // 60 seconds 
_ignitedHttp.setSocketTimeout(1);   // v short 

tôi nhận được một ngoại lệ Socket.

Vì vậy, câu hỏi của tôi là tại sao tôi không thể mô phỏng ngoại lệ kết nối? Tôi có hiểu lầm sự khác biệt giữa ổ cắm và thời gian chờ kết nối không? Thư viện là here (chưa chính thức được xuất bản).

Trả lời

159

A thời gian chờ kết nối chỉ xảy ra khi bắt đầu kết nối TCP. Điều này thường xảy ra nếu máy từ xa không trả lời. Điều này có nghĩa là máy chủ đã bị tắt, bạn đã sử dụng sai tên IP/DNS hoặc kết nối mạng với máy chủ bị hỏng.

A thời gian chờ của ổ cắm được dành riêng để theo dõi luồng dữ liệu đến liên tục. Nếu luồng dữ liệu bị gián đoạn trong thời gian chờ được chỉ định thì kết nối sẽ bị coi là bị dừng/hỏng. Tất nhiên điều này chỉ hoạt động với các kết nối nơi dữ liệu được nhận mọi lúc.

Bằng cách đặt thời gian chờ của ổ cắm thành 1 điều này sẽ yêu cầu nhận được mỗi mili giây dữ liệu mới (giả sử rằng bạn đọc khối dữ liệu khôn ngoan và khối đủ lớn)!

Nếu chỉ có luồng đến trong hơn một phần nghìn giây bạn đang chạy vào một thời gian chờ.

+1

Bạn có bao giờ hết thời gian chờ kết nối nếu máy chủ không ngừng hoạt động nhưng bận không? Hoặc đó sẽ là một thời gian chờ ổ cắm? – Robert

+7

Điều đó phụ thuộc - nếu kết nối TCP đã được thiết lập trước khi máy chủ bị quá tải, bạn sẽ nhận được ngoại lệ socket - nếu không bạn sẽ nhận được ngoại lệ kết nối, cho biết kết nối TCP không thể được thiết lập. – Robert

+0

Ngoài ra giá trị tiêu biểu của thời gian chờ của socket và thời gian chờ kết nối cho thiết bị di động là gì? Là một trong những thường lớn hơn khác? – Robert

42

A thời gian chờ kết nối là khoảng thời gian tối đa mà chương trình sẵn sàng chờ để thiết lập kết nối với quy trình khác. Bạn không nhận được hoặc đăng bất kỳ dữ liệu ứng dụng nào vào thời điểm này, chỉ cần thiết lập kết nối, chính nó.

A thời gian chờ của ổ cắm là thời gian chờ khi chờ gói riêng lẻ. Đó là một quan niệm sai lầm phổ biến rằng một thời gian chờ socket là thời gian chờ để nhận được phản ứng đầy đủ. Vì vậy, nếu bạn có thời gian chờ socket 1 giây và phản hồi bao gồm 3 gói IP, trong đó mỗi gói phản hồi mất 0,9 giây để đến, trong tổng thời gian phản hồi 2,7 giây, thì sẽ không có thời gian chờ.

+0

OK. 1. Vì vậy, chúng ta có thể nói rằng SocketTimeout chỉ đi vào hình ảnh khi một kết nối đã được thiết lập? 2. Điều gì sẽ xảy ra nếu không có luồng dữ liệu nào giống như nói 5 phút sau khi nhận được 3 gói? Sẽ có ngoại lệ SocketTimeout sau khi gói thứ 3 đã được nhận chưa? –

+0

@SaurabhPatil 1. Có. Xem [Tổng quan kỹ thuật của Wikipedia về giao thức HTTP] (https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Technical_overview) để xác nhận. 2. Khi kết thúc tin nhắn được gửi, không cần thêm dữ liệu nào, vì vậy thời gian chờ của ổ cắm sẽ không xảy ra. Xem [câu trả lời này] (https://stackoverflow.com/a/4824738/4851565) về chủ đề này. – entpnerd