2011-10-31 38 views
10

Tôi có ứng dụng máy khách đơn giản. Tất cả mọi thứ hoạt động, nhưng ở một số giai đoạn phải mất hơn 5 phút để nhận được phản hồi từ máy chủ (đó là bình thường và nó cần phải như thế này). Vấn đề là nếu phải mất hơn 5 phút tôi tiếp tục nhận được ngoại lệ này: java.net.SocketTimeoutException: Read timed out.Java, tăng thời gian chờ của ổ cắm

Vì vậy, tôi đã tự hỏi nếu có một số thời gian chờ ổ cắm mặc định trên các cửa sổ hoặc trên máy ảo Java tôi có thể thiết lập? Tôi không thể thay đổi mã máy khách để setSoTimeout() không phải là một lựa chọn cho tôi.

Sử dụng Windows XP ..

EDIT: Như tôi hiểu bây giờ là kết nối ổ cắm không được mở ở phía máy khách. Nó được truyền từ máy chủ. Vì vậy, tôi decompiled allso tập tin jar máy chủ. Nhưng vẫn không thể tìm thấy bất cứ điều gì về thời gian chờ.

+0

Kiểm tra xem thời gian chờ có được định cấu hình bằng thuộc tính Hệ thống hay không. – JimmyB

+0

@ HannoBinder, bạn có thể giải thích ý nghĩa của thuộc tính Hệ thống không? – hs2d

+0

Tôi có nghĩa là một cái gì đó như [sun.net.client.defaultReadTimeout] (http://download.oracle.com/javase/1.4.2/docs/guide/net/properties.html), hoặc bất cứ điều gì có thể áp dụng cho cách của khách hàng của bạn kết nối. – JimmyB

Trả lời

10

Thời gian chờ của socket mặc định là 0, có nghĩa là không bao giờ hết thời gian chờ. Nếu nó thực sự hết thời gian sau 5 phút, điều đó có nghĩa là nó đã được đặt trong mã. Nếu nguồn không khả dụng và không có cấu hình, bạn có thể thử dịch ngược lớp và tìm kiếm các cuộc gọi setSoTimeout.

Vì nhận xét và thực tế là tìm kiếm không tìm thấy bất kỳ cuộc gọi setSoTimeout() nào, bạn có thể thực hiện một cách tiếp cận khác. Chỉ cần để nó hết thời gian và viết một tập lệnh nhỏ sẽ thử lại cuộc gọi trong trường hợp có. Nếu bạn có thể gọi cho khách hàng của mình từ dòng lệnh, bạn có thể phân tích cú pháp đầu ra, nếu nó xuất hiện trên stderr.

+0

Tôi đã biên dịch và tìm kiếm các lệnh gọi 'setSoTimeout' nhưng không tìm thấy gì cả. Nó phải được đặt ở một nơi khác sau đó? – hs2d

8

Giữ kết nối TCP không được sử dụng mở trong thời gian dài mà không có bất kỳ lưu lượng truy cập nào không phải là tầm thường. Nhiều tường lửa/bộ định tuyến đóng các cổng không sử dụng sau một thời gian chờ.

Một tùy chọn có thể là triển khai giao thức keepalive đơn giản để gửi các gói giả mỗi lúc và sau đó, nhưng nếu bạn không thể chạm vào mã máy khách thì đây có thể không phải là một tùy chọn.

Chỉnh sửa: Tôi không biết bất kỳ cách nào để ghi đè setSoTimeout() được đặt trong mã máy khách.

+0

ý tưởng rất hay với gói dữ liệu còn sống! – benez

+0

@benez Tôi không đồng ý. Nếu bộ định tuyến liên quan đến kết nối như một nguồn tài nguyên quý giá mà nó đã hết, bạn không có bất kỳ doanh nghiệp nào lừa nó để mở nó. Trong mọi trường hợp bạn vẫn phải đối phó với tổn thất kết nối anyway. Thêm ping cố định chỉ là một nỗi đau vô nghĩa ở cổ thực sự. – EJP

+0

@EJP tôi chưa thấy một cài đặt thích hợp để xử lý các lỗ kết nối. có những trường hợp bạn đang chờ cập nhật thời gian thực và bạn cần hai bên liên tục kết nối để giữ cho dữ liệu của họ được đồng bộ hóa. mất kết nối không chỉ đơn giản là xử lý với một kết nối lại đơn giản. bạn sẽ bỏ lỡ một thông điệp quan trọng hoặc làm cho nó đến muộn. ví dụ. thị trường chứng khoán luôn gửi nhịp tim và giao thức irc yêu cầu bạn trả lời cho một ping với pong. và có bạn phải đối phó với tổn thất kết nối, nhưng bạn có thể muốn tránh chúng trong một số chương trình. – benez

0

Trả lời rằng 0 là thời gian chờ mặc định không hoàn toàn đúng. Vì ví dụ, máy khách Axis2 có thời gian chờ mặc định là 60 giây nên nó sẽ phụ thuộc vào loại triển khai bạn đang sử dụng để thực hiện cuộc gọi.

Bạn có thể cung cấp thêm chi tiết không? Xin lỗi vì đã viết phần câu trả lời nhưng tôi không có đủ danh tiếng để làm nhận xét :)

+0

Nhìn vào mã ở đây tôi chỉ có thể thấy 'java.io.InputStream'. Vì vậy, kết nối phải được thực hiện từ máy chủ cho khách hàng? – hs2d

+0

, vâng, đối với Java, mặc định là vô hạn, nhưng một thư viện có thể thay đổi điều đó. Có lẽ là một gợi ý, hs2d, bạn có bất kỳ bình bao gồm? Hoặc có thể, bạn có thể thực hiện một cách tiếp cận khác, chỉ để nó hết thời gian và thử lại nếu nó không thành công. – stivlo

0

Và bạn có cần giữ kết nối còn sống không? Tại sao bạn không suy nghĩ lại nó để làm cho nó không đồng bộ hơn. Lược đồ đó không phải là mở rộng quy mô. Tại một thời điểm tất cả các chủ đề có sẵn của bạn có thể chờ đợi một phản hồi thời gian dài từ máy chủ.

+0

Anh ta cần giữ kết nối còn sống nếu anh ta muốn đọc từ nó. Không thể làm cho đầu hoặc đuôi của tất cả điều này. – EJP

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