java - java中仅支持IPv6的套接字

标签 java sockets ip-address ipv6

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

我想知道一台机器上是否可以有 2 个套接字,其中一个绑定(bind)到 ipv4 地址,另一个仅绑定(bind)到 ipv6 地址。 Networking IPv6 User Guide for JDK/JRE 5.0解释了 ipv6 如何在 Java 平台上工作,但没有提及有关仅 ipv6 套接字的任何内容。它们有可能吗?我无法设置全局 IPV6_V6ONLY 属性。

最佳答案

我也需要同样的东西 - 拥有独立的 tcp 套接字(IPv4 和 IPv6)来监听相同的端口号。我发现的唯一解决方案是为主机上的每个地址创建一对套接字(IPv4 和 IPv6)。

为了简单起见,以下代码仅限于仅在本地主机上监听。它创建两个 ServerSocket 实例。其中之一绑定(bind)到 IPv4 本地主机,其中之一绑定(bind)到 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

关于java - java中仅支持IPv6的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27280015/

相关文章:

c - 如何在不调用 GetQueuedCompletionStatus() 的情况下知道 WSASend() 操作是否已完成?

kernel - WFP 中标注的 classifyFn 中指定的 IP 地址的字节顺序是什么?

java - 如何使用 Selenium 放心调用体内函数

java - C++ 中的模板、Java 中的泛型和 >> 位移运算符

java - Talend Open Studio 将作业导出为 Web 服务并在不带 URL 参数的情况下调用它

java - Android : Should I remove @Override from facebook. java?

python - 如何通过开放的 shell 端口使用 python 套接字访问 Metasploitable 2 VM shell?

visual-studio - 在Visual Studio中进行负载测试期间的套接字异常

asp.net-mvc - 当服务器位于 AWS ELB 之后时,ASP.NET Core MVC 应用程序如何获取客户端 IP 地址?