2012-04-30 15 views
15

Một trong các chương trình Java của chúng tôi khi bắt đầu, nó chỉ nghe trên IPv6 (8080)Cách hỗ trợ cả IPv4 & IPv6 trên Java

ví dụ:

# netstat -ntpl 

Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 
tcp  0  0 0.0.0.0:22    0.0.0.0:*    LISTEN  -    
tcp6  0  0 :::8080     :::*     LISTEN  -    
tcp6  0  0 :::22     :::*     LISTEN  -    

Vấn đề là nó không thể truy cập từ bên ngoài (ngoại trừ localhost), để giải quyết điều này, tôi có điều này tự thêm

-Djava.net.preferIPv4Stack=true 

Nhưng điều này làm cho chương trình này chỉ dành cho mạng IPv4.

Có thể làm điều gì đó giống như sshd như trên, cả hai đều hỗ trợ IPv4 và IPv6?

Trả lời

21

tôi nghi ngờ đó là ít hơn một vấn đề lập trình Java so với một hệ điều hành mạng vấn đề cấu hình stack/OS mạng:

http://coding.derkeiler.com/Archive/Java/comp.lang.java.help/2009-09/msg00087.html

Trên một số hệ điều hành, một socket TCP có nguồn gốc duy nhất có thể nghe một cảng trên cả hai Đồng thời IPv4 và IPv6. Nó có thể chấp nhận các kết nối từ IPv4 từ xa và từ các máy khách IPv6 từ xa. Trên các hệ điều hành khác (chẳng hạn như WinXP) ổ cắm gốc của hệ điều hành KHÔNG THỂ làm điều đó, nhưng chỉ có thể chấp nhận từ IPv4 hoặc IPv6, không phải cả hai. Trên các hệ điều hành này, cần phải có hai cổng nghe để có thể chấp nhận các kết nối từ cả IPv4 và các máy khách IPv6 từ xa, một ổ cắm để nghe kết nối IPv4 và một cho IPv6.

Windows 7 và Windows Server 2008 xử lý ngăn xếp kép tốt; Windows XP không nhiều lắm :)

Bạn dường như đang ở trên Linux - hầu hết các máy tính để bàn và máy chủ Linux hiện đại cũng xử lý ipv6 ipv6 kép mà không có vấn đề gì.

Dưới đây là một bài viết tốt về khả năng tương tác:

Bạn biết làm thế nào bạn có thể "tắt" IPV6 cho các ứng dụng Java của bạn: -Djava.net.preferIPv4Stack=true

Bạn cũng có thể buộc máy chủ của bạn để sử dụng IPV6 như thế này: echo 0 > /proc/sys/net/ipv6/bindv6only

Điều này được cho là b của bạn nguồn est:

Bạn hoàn toàn có thể thực hiện những gì bạn muốn (ít nhất là ở mức độ lập trình Java), trừ khi bạn đang bị hạn chế bởi các vấn đề mạng bên ngoài:

Nodes)  V4 Only V4/V6 V6 Only 
      ------- ----- ------- 
V4 Only  x  x 
V4/V6  x  x  x 
V6 Only    x  x 

PS:

Đây là một liên kết tốt hơn, giải thích điều gì đang xảy ra ở cấp độ ổ cắm.Nó không phải Java (đó là C), nhưng chính xác các nguyên tắc áp dụng mẫu: