【问题标题】:Client socket - get IP - java客户端套接字 - 获取 IP - java
【发布时间】:2014-05-06 14:53:54
【问题描述】:

我正在使用套接字实现 TCP 连接,我需要在服务器端获取客户端套接字的 IP。我使用了socketName.getRemoteSocketAddress(),它确实返回了IP地址,后跟我正在使用的端口ID!我怎样才能只得到地址而不是端口?

【问题讨论】:

    标签: java sockets client


    【解决方案1】:

    这个返回的SocketAddress实际上是一个protocol-dependent subclass。对于 Internet 协议,例如您的 TCP,您可以将其转换为 InetSocketAddress

    InetSocketAddress sockaddr = (InetSocketAddress)socketName.getRemoteSocketAddress();
    

    然后你可以使用InetSocketAddress的方法来获取你需要的信息,例如:

    InetAddress inaddr = sockaddr.getAddress();
    

    然后,您可以根据地址类型将其转换为Inet4AddressInet6Address(如果您不知道,请使用instanceof 查找),例如如果你知道它是 IPv4:

    Inet4Address in4addr = (Inet4Address)inaddr;
    byte[] ip4bytes = in4addr.getAddress(); // returns byte[4]
    String ip4string = in4addr.toString();
    

    或者,一个更强大的例子:

    SocketAddress socketAddress = socketName.getRemoteSocketAddress();
    
    if (socketAddress instanceof InetSocketAddress) {
        InetAddress inetAddress = ((InetSocketAddress)socketAddress).getAddress();
        if (inetAddress instanceof Inet4Address)
            System.out.println("IPv4: " + inetAddress);
        else if (inetAddress instanceof Inet6Address)
            System.out.println("IPv6: " + inetAddress);
        else
            System.err.println("Not an IP address.");
    } else {
        System.err.println("Not an internet protocol socket.");
    }
    

    【讨论】:

    • 只需使用您的第一个提示(编辑前)即可完美运行。谢谢!
    【解决方案2】:
    ((InetSocketAddress)socketName).getAddress().toString()
    

    将返回类似 :/10.255.34.132 的内容,其中包含主机名,如果您不想要主机名,可以试试这个:

    ((InetSocketAddress)socketName).getAddress().toString().split("/")[1]
    

    【讨论】:

      猜你喜欢
      • 2020-01-08
      • 1970-01-01
      • 2019-08-28
      • 2016-01-01
      • 2014-11-28
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多