2008-09-22 41 views
10

Trong Java, bạn có thể cung cấp số không là một tham số duy nhất cho bộ tạo Socket hoặc DatagramSocket. Java liên kết Socket đó với một cổng miễn phí sau đó. Có thể giới hạn tra cứu cổng cho một phạm vi cụ thể không?Làm thế nào để bạn chỉ định một phạm vi cổng cho các ổ cắm Java?

+0

Vâng, đối với người dùng không có đặc quyền đó đã được giới hạn đến> 1024 trên * nix: P – freespace

+0

Đáng tiếc là chúng tôi đang chạy trên cửa sổ;) –

Trả lời

7

Hrm, sau khi đọc tài liệu, tôi không nghĩ bạn có thể. Bạn có thể liên kết với bất kỳ cổng nào, sau đó rebind nếu nó không được chấp nhận, hoặc liên tục liên kết với một cổng trong phạm vi của bạn cho đến khi bạn thành công. Phương pháp thứ hai sẽ là hiệu quả nhất.

Tôi lo lắng về câu trả lời này, bởi vì nó là ... không thanh nha, nhưng tôi thực sự không thể tìm thấy bất cứ điều gì khác hoặc là:/

+2

Bạn cũng nên lưu ý rằng đôi khi có những tác động bảo mật khi thực hiện tìm kiếm tuyến tính cho một cổng miễn phí. Nếu bạn sử dụng cổng A cho máy khách 1 và cổng A + 1 cho ứng dụng khách tiếp theo thì máy khách 1 có thể đoán cổng bạn sẽ sử dụng cho một số ứng dụng khách khác. – Darron

2

Ràng buộc các ổ cắm vào bất kỳ cổng miễn phí (thường là) một tính năng của hỗ trợ socket của hệ điều hành; nó không dành riêng cho java. Solaris, ví dụ, hỗ trợ điều chỉnh phạm vi cổng tạm thời thông qua lệnh ndd. Nhưng chỉ root mới có thể điều chỉnh phạm vi, và nó ảnh hưởng đến toàn bộ hệ thống, không chỉ chương trình của bạn.

Nếu hành vi ràng buộc phù du thường xuyên không phù hợp với nhu cầu của bạn, bạn có thể phải tự viết bằng cách sử dụng Socket.bind().

0

Bạn có thể lướt qua mã java thực hiện chức năng bạn đang sử dụng. Hầu hết các thư viện java được viết bằng Java, vì vậy bạn có thể thấy những gì bạn cần ở đó.

Giả sử @Kenster đã đúng và đó là một thao tác hệ thống, bạn có thể phải lặp lại qua các cổng cố gắng liên kết với từng cổng hoặc kiểm tra nó. Mặc dù có một chút đau đớn, nhưng nó không nên nhiều hơn một vài dòng mã.

1

Dưới đây là đoạn code mà bạn cần:

public static Socket getListeningSocket() { 
    for (int port = MIN_PORT ; port <= MAX_PORT ; port++) 
    { 
     try { 
      ServerSocket s = new ServerSocket(port); 
      return s;  // no exception means port was available 
     } catch (IOException e) { 
      // try the next port 
     } 
    } 
    return null; // port not found, perhaps throw exception? 
} 
+3

Bạn nên bắt giữ BindException, là thiết bị được khởi chạy khi cổng đã được sử dụng. – Chochos

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