【问题标题】:How to retrieve client's IP and PORT on the server socket end?如何在服务器套接字端检索客户端的 IP 和 PORT?
【发布时间】:2014-02-09 04:14:03
【问题描述】:

我有一个基于桌面端运行的套接字侦听器 java,并且我有一个移动客户端,它能够毫无问题地连接到这个套接字服务器。当客户端尝试访问新连接时,我想分别为每个客户端建立套接字连接。我从这个链接中读到,Reference link for multiple connection detection

关于套接字如何区分多个连接。提到基于在套接字服务器上检测到的客户端连接的 IP 和 PORT,并且每个连接的连接都是唯一的。每个连接的客户端端口都不同。我读到了,我们可以调用getpeername 来获取客户端连接的IP 和套接字服务器端的端口。但是,我在 Java 中看不到任何这样的 API,然后找到了下面的。

ServerSocket server = new ServerSocket(8080);
System.out.println("server.getInetAddress();: " + server.getInetAddress());

但是,它总是返回server.getInetAddress():- 0.0.0.0/0.0.0.0 当移动客户端(模拟器)调用此套接字时。

有人可以告诉我,为什么我没有在套接字端使用上述 InetAddress API 获取客户端的 IP 和端口?还是我需要使用不同的方法?

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    当服务器 accepts 连接时,您将获得代表该连接的 SocketSocket 有一个 getInetAddress() 方法将返回远程地址,以及一个相应的 getPort() 方法将返回远程端口。

    例如:

    Socket newSock = s.accept();
    InetAddress addr = s.getInetAddress();
    int         port = s.getPort();
    

    【讨论】:

    • 但是需要注意的是,你得到的IP地址可能不是真实客户端机器的IP地址。考虑 NAT 案例和 HTTP 代理案例。
    • 当然是你连接的外部可见地址,可能是NAT网关,也可能是代理。无论如何,这些地址后面的地址都无法路由。
    • 嗨,吉姆,非常感谢!我试过“int port = server.getLocalPort()”而不是“s.getPort();”。我正在尝试使用移动客户端模拟器和套接字也在运行的同一台机器,所以它导致“addr:0.0.0.0/0.0.0.0 port:8080”这样......我想,我必须测试使用真正的物理移动设备,这样我就可以正确获取实际客户端的 IP 和 PORT。
    • 它工作正常。当我尝试从不同的移动设备客户端访问此套接字时,它会提供不同的客户端 IP 地址。但是,即使我尝试了不同的移动客户端,如 iOS、Android 等,我总是得到同一个客户端的 8080 端口。知道可能是什么原因吗?手机可能连接在同一个无线网络中吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2011-11-15
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多