ConnectionTimeout so với SocketTimeout


135

Tôi đang gặp vấn đề với một thư viện mà tôi đang sử dụng. Nó có thể là thư viện hoặc có thể là tôi sử dụng sai!

Về cơ bản, khi tôi làm điều này (Hết giờ tính bằng mili giây)

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

Không có ngoại lệ thời gian chờ được tạo và nó hoạt động tốt, tuy nhiên, khi tôi làm như sau,

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

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

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 nhầm sự khác biệt giữa ổ cắm và thời gian chờ kết nối không? Thư viện ở đây (chưa được phát hành chính thức).

Câu trả lời:


227

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, cổng sai hoặc kết nối mạng với máy chủ bị tắt.

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ờ đã chỉ định, kết nối được coi là bị đình trệ / bị 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 mỗi mili giây mới nhận được dữ liệu (giả sử rằng bạn đọc khối dữ liệu một cách khôn ngoan và khối này đủ lớn)!

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


1
Bạn có thể nhận được thời gian chờ kết nối nếu máy chủ không hoạt động nhưng bận không? Hay đó sẽ là một thời gian chờ ổ cắm?
Robert

9
Đ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ẽ có ngoại lệ ổ cắm - nếu không, bạn sẽ 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

2
Xem xét độ trễ cao của các mạng di động đặc biệt cũ hơn, thời gian chờ kết nối phải được đặt thành vài giây (ví dụ: 10 giây hoặc tốt hơn 10000 msec). Hết thời gian chờ ổ cắm tôi sẽ chỉ đặt nếu bạn không sử dụng một số kết nối vì HTTP có thể sử dụng lại kết nối sau khi có yêu cầu.
Robert

1
Điều này có nghĩa là nếu bạn đặt thời gian chờ của ổ cắm (ví dụ 1 phút), thì kết nối sẽ bị tắt sau 1 phút không hoạt động, như thường sẽ được sử dụng lại nếu không có thời gian chờ nào được đặt?
Robert

2
@Robert Bạn không nhất thiết phải có ngoại lệ kết nối nếu máy chủ quá bận. Nó phụ thuộc vào nền tảng, trên nền tảng máy chủ. Hết thời gian chờ đọc ổ cắm không giết kết nối. Nó chỉ gây ra một socketTimeoutException. Cho dù kết nối vẫn có thể sử dụng được là một quyết định mà ứng dụng phải đưa ra. Chắc chắn không có gì về API nói rằng bạn không thể thử thêm I / O trên ổ cắm. Tuyên bố của bạn về việc không sử dụng thời gian chờ nếu bạn sử dụng nhiều kết nối sẽ không có ý nghĩa. Quá nhiều thông tin sai lệch ở đây.
Hầu tước Lorne

83

Thời gian chờ kết nối là lượ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 hoặc đăng bất kỳ dữ liệu ứng dụng nào tại thời điểm này, chỉ cần thiết lập kết nối.

Một thời gian chờ ổ cắm là thời gian chờ khi chờ đợi cho các gói cá nhân. Đó là một quan niệm sai lầm phổ biến rằng thời gian chờ ổ cắm là thời gian chờ để nhận được phản hồi đầy đủ. Vì vậy, nếu bạn có thời gian chờ ổ cắm là 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, với tổng thời gian phản hồi là 2,7 giây, thì sẽ không có thời gian chờ.


3
Được chứ. 1. Vậy chúng ta có thể nói rằng SocketTimeout chỉ xuất hiện khi kết nối đã được thiết lập không? 2. Điều gì xảy ra nếu không có luồng dữ liệu nào trong khoảng 5 phút sau khi nhận được 3 gói? Sẽ có ngoại lệ SocketTimeout sau khi nhận được gói thứ 3?
Saurabh Patil

2
@SaurabhPatil 1. Có. Xem Tổng quan kỹ thuật của Wikipedia về giao thức HTTP để 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, 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 về chủ đề.
entpnerd

7
Tôi ước họ đã đặt tên "thời gian chờ ổ cắm" là "thời gian chờ không hoạt động".
Manish Maheshwari
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.