java中仅IPv6套接字

时间:2014-12-03 19:27:31

标签: java sockets ip-address ipv6

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

我想知道我是否可以在一台机器上安装2个套接字,以便一个绑定到ipv4地址,另一个绑定到ipv6地址。 Networking IPv6 User Guide for JDK/JRE 5.0解释了ipv6如何在Java平台上运行,但没有说明只有ipv6的套接字。他们甚至可能吗?我无法设置全局IPV6_V6ONLY属性。

2 个答案:

答案 0 :(得分:1)

关于IPV6的问题是,它只与IPV6兼容。

Which is the drawback of IPv6

截至2014年:

  

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

source

答案 1 :(得分:0)

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

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

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();
    }
}

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