2010-07-29 66 views
7

Khi sử dụng java.net.Socket.connect(), cả kết nối bị từ chối và kết quả thời gian chờ là ConnectException.Phân biệt giữa kết nối bị từ chối và kết nối hết thời gian

java.net.ConnectException: Connection timed out: connect 

java.net.ConnectException: Connection refused: connect 

Làm cách nào để phân biệt một cách an toàn giữa hai loại này? Chắc chắn phân tích cú pháp thông báo lỗi thực hiện công việc. Nhưng khi thông báo thay đổi trong bản phát hành Java trong tương lai, tôi không may mắn.

Ảnh lớn hơn: Tôi đang viết ứng dụng khách dịch vụ web sử dụng JAX-WS với triển khai Metro. Khi một cuộc gọi dịch vụ web không thành công, tôi muốn báo cáo lý do cho sự thất bại rõ ràng để vấn đề có thể được giải quyết nhanh chóng.

Trả lời

2

Thật không may, trong JDK mặt trời, thông tin này không được cung cấp ở bất kỳ nơi nào trừ chuỗi. Xem dòng 473 của PlainSocketImpl.c (dành cho * ix) và net_util_md.c (dành cho Windows). Việc triển khai * ix đôi khi gọi NET_ThrowByNameWithLastError (từ * ix net_util_md.c), sẽ bao gồm errno trong chuỗi; chức năng này tồn tại trên Windows, nhưng nó không được sử dụng ở đây ..

Vì vậy, bạn phải dựa vào các dây và hy vọng chúng không thay đổi. Mặt trời dường như không bản địa hoá chúng, điều này có ý nghĩa bởi vì chúng không được cho là phải đối mặt với người dùng. Bạn có thể thử phân tích cú pháp errno ra để có một mã lỗi ổn định hơn.

Bạn cũng nên chắc chắn có trường hợp bị thu hồi trong trường hợp không có kết quả trùng khớp hoặc chuỗi.

+0

Có một dự phòng là một giải pháp có thể chấp nhận được. –

+0

Tôi thích câu trả lời này, nhưng vẫn duy trì đề xuất cũ của tôi: trừu tượng hóa nó đi! Điều cuối cùng bạn muốn là một loạt các kiểm tra không phù hợp và lặp đi lặp lại trên một giao diện mà bạn không thể dựa vào. Tạo một giao diện có ý nghĩa với bạn và trừu tượng hóa các chi tiết. Bạn không muốn chỉnh sửa một tá tệp nếu có bất cứ điều gì thay đổi. – riwalk

0

Kiểm tra thông báo lỗi (như bạn đã đề cập), nhưng tóm tắt nó đi.

Nếu thay đổi trong bản phát hành Java trong tương lai, bạn thay đổi nó trong phần tóm tắt và để nguyên lõi của mã của bạn.

+1

Thao tác này sẽ ngắt ngay lập tức nếu JVM có các thư được bản địa hóa. –

3

Đo thời gian trôi qua giữa cách gọi kết nối() và ngoại lệ được ném và chuyển thông tin đó vào.

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