2010-02-09 24 views
7

Trong Java, tôi cần lấy một số cổng để liên lạc giữa nhiều phiên bản của cùng một chương trình. Bây giờ, tôi có thể chỉ cần chọn một số số cố định và đi với nó. Nhưng tôi tự hỏi nếu có một cách để tự động chọn số cổng, vì vậy mà tôi không phải bận tâm người dùng của tôi với thiết lập số cổng.Tự động chọn số cổng?

Dưới đây là một ý tưởng tôi đã có, trong đó hoạt động như thế này:

  • Có một số cổng ban đầu cố định A.
  • Chương trình bắt đầu 'MyApp', cố gắng để lấy cổng A.
  • Nếu nó thành công , đó là ví dụ đầu tiên của 'MyApp'. Làm xong.
  • Nếu không thành công, nó sẽ hỏi qua cổng A cho dù chương trình trên A là một phiên bản của 'MyApp'. Nếu có, hãy liên lạc với trường hợp đó. Làm xong. Nếu không, hãy thử lấy cổng A + 1. Và nếu có một chương trình khác sử dụng cổng đó (không phải là phiên bản của 'MyApp'), thì hãy lấy A + 2, rồi A + 3, v.v.

Chiến lược này có hợp lý không? Hoặc là có một cách tốt hơn để tự động chọn một số cổng?

+1

Bạn không cần phải làm như vậy. Nếu bạn tạo một ổ cắm, hệ thống sẽ tự động gán số cổng sẵn có tiếp theo cho bạn. Vui lòng đọc kỹ tài liệu về API ổ cắm bạn đang sử dụng. Cũng cung cấp thêm thẻ về ngôn ngữ lập trình/thư viện bạn đang sử dụng. –

+0

@dma_k: Trong Java, dường như bạn phải liên kết với cổng 0 để đạt được điều đó (truy cập trực quan, tôi biết). Nếu bạn không ràng buộc chút nào, bạn sẽ không thể nghe nó. :-P –

+0

Khá nhiều việc thực hiện socket tôi có thể nhớ sử dụng thủ thuật "phản trực giác" này để yêu cầu một cổng được gán động ... không có gì đặc biệt ở đây. – jldupont

Trả lời

26

Nếu bạn liên kết với cổng 0, Java sẽ sử dụng cổng do hệ thống tạo. :-) Vì vậy, đó có lẽ là cách dễ nhất để quay trở lại nếu cổng mong muốn của bạn đã được sử dụng.

ServerSocket s = new ServerSocket(0); 
int port = s.getLocalPort(); // returns the port the system selected 
+2

... và các cá thể sẽ tìm thấy nhau như thế nào? Đó không phải là câu hỏi là gì? – jldupont

3

Tôi sẽ đảo ngược và chọn cổng cao cố định cho ứng dụng của bạn. Đặt nó thành giá trị cấu hình để có thể thay đổi nếu cần. Điều này sẽ đơn giản hóa cấu hình thường xuyên khi người dùng ứng dụng cần yêu cầu các hoạt động mạng để mở cổng. Làm việc xung quanh các giá trị IANA gán:

http://www.iana.org/assignments/port-numbers

cổng quét có thể biến ứng dụng của bạn thành một công dân tốt cho nhiều hệ thống phát hiện xâm nhập.

1

Bạn có thể sử dụng Bonjour/ZeroConf để quảng cáo các dịch vụ của từng trường hợp và bật một cá thể để tìm những người khác. Hãy coi đây là dịch vụ thư mục có thể giúp quản lý không gian tên cổng của bạn.

Mỗi trường hợp chỉ có thể lấy một cổng được gán động trong trường hợp này. Yêu cầu ràng buộc cổng "0" thường sẽ hướng dẫn hệ thống gán cổng động.

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