2009-04-20 29 views
8

Tôi đang sử dụng giao tiếp Socket trong một trong các ứng dụng Java của mình. Tôi biết nếu chương trình đáp ứng bất kỳ chấm dứt bất thường nào thì cổng nghe không bị đóng và chương trình không thể khởi động lại vì báo cáo "Cổng đã mở .." Tôi có anyway để xử lý vấn đề này? Cách chung được sử dụng để xử lý vấn đề này là gì?Làm cách nào để đóng cổng trong trường hợp chấm dứt chương trình?

Trả lời

22

Có vẻ như chương trình của bạn đang nghe trên ổ cắm. Thông thường, khi chương trình của bạn thoát khỏi hệ điều hành, hãy đóng tất cả các ổ cắm có thể mở (bao gồm cả ổ cắm nghe). Tuy nhiên, để nghe các ổ cắm, hệ điều hành thường giữ cổng trong một thời gian (vài phút) sau khi thoát khỏi chương trình của bạn để nó có thể xử lý mọi nỗ lực kết nối chưa xử lý. Bạn có thể nhận thấy rằng nếu bạn tắt chương trình của bạn bất thường, sau đó trở lại một thời gian sau đó nó sẽ khởi động tốt.

Nếu bạn muốn tránh thời gian trễ này, bạn có thể sử dụng setsockopt() để định cấu hình socket bằng tùy chọn SO_REUSEADDR. Điều này cho hệ điều hành biết rằng bạn biết có thể sử dụng lại cùng địa chỉ đó và bạn sẽ không gặp vấn đề này.

Bạn có thể đặt tùy chọn này bằng Java bằng cách sử dụng phương thức ServerSocket.setReuseAddress(true).

2

Hệ điều hành sẽ xử lý những thứ như tự động, khi quá trình JVM kết thúc. Có thể có một sự chậm trễ ngắn trước khi cổng được đóng lại, mặc dù.

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