2014-12-03 34 views
1

是否可以在java中创建一个只绑定到ipv6地址的套接字?java中的仅IPv6套接字

我想知道,如果我可以有一个机器上的2个插座,这样一个绑定到ipv4地址,另一个绑定到ipv6地址只。 Networking IPv6 User Guide for JDK/JRE 5.0解释了ipv6如何在Java平台上工作,但没有提到有关仅用于ipv6套接字的任何内容。他们甚至有可能吗?我无法设置全局IPV6_V6ONLY属性。

+0

但是根据定义,没有这样的事情。我认为 - IPv6旨在向后兼容,? – Coffee 2014-12-03 19:31:22

+0

哎呀,错误的逻辑。我想我的意思是......当然,IPV6是*只有* IPV6 – Coffee 2014-12-03 19:32:08

+0

可能重复的[Java - 我怎么能喜欢IPv6?](http://stackoverflow.com/questions/19314241/java-how-can-i -prefer-ipv6) – elias 2014-12-03 19:33:10

回答

0

关于IPV6的一点是,它只与IPV6兼容。

Which is the drawback of IPv6

截至2014年:

的IPv4,它仍然带有互联网流量的96%以上,全球

source

+2

取决于你的意思是“兼容”。有很多自动转换助手。 – Deduplicator 2014-12-03 23:26:19

0

我需要是相同的 - 有单独的tcp套接字(IPv4和IPv6)在相同的端口号上侦听。我找到的唯一解决方案是为主机上的每个地址创建一对套接字(IPv4和IPv6)。

为简单起见,以下代码仅限于在本地主机上侦听。它创建两个ServerSocket实例。其中一个绑定到IPv4本地主机,其中一个绑定到IPv6本地主机。

import java.io.*; 
import java.net.*; 

public class DualSock implements Runnable { 

    ServerSocket s; 
    String ver; 
    static final int port = 1234; 

    public void run() { 
     while (true) { 
      try { 
       Socket client = s.accept(); 
       System.out.println("Connection over " + ver + " from " + client.getRemoteSocketAddress()); 
       client.close(); 
      } catch (Exception e) { 
       System.out.println(e); 
       System.exit(1); 
      } 
     } 
    } 

    public DualSock(ServerSocket s, String ver) { 
     this.s = s; 
     this.ver = ver; 
    } 

    public static void main(String argv[]) throws Exception { 
     InetAddress address4 = InetAddress.getByName("127.0.0.1"); 
     ServerSocket server4 = new ServerSocket(port, 5, address4); 
     DualSock ip4app = new DualSock(server4, "IPv4"); 

     InetAddress address6 = InetAddress.getByName("::1"); 
     ServerSocket server6 = new ServerSocket(port, 5, address6); 
     DualSock ip6app = new DualSock(server6, "IPv6"); 

     new Thread(ip4app).start(); 
     new Thread(ip6app).start(); 
    } 
} 

将通信限制在本地主机并不是非常有用。真正的应用程序需要enumerate network interfaces,获取其地址,然后为主机上的每个地址创建一个ServerSocket