【问题标题】:Why socket does not connect with ip instead of localhost?为什么套接字不使用 ip 而不是 localhost 连接?
【发布时间】:2016-09-22 01:26:57
【问题描述】:

我正在尝试通过 IP 地址连接到服务器,但它不起作用。两者都在同一台机器上,当我将 ipAddress 更改为 localhost 时,它可以工作。那是什么原因呢?

try {
    String ipAddress = "46.155.17.100";
    int port = 8082;

    // Create a socket to connect to the server
    socket = new Socket(ipAddress, port);

    toServer = new ObjectOutputStream(socket.getOutputStream());

    fromServer = new ObjectInputStream(socket.getInputStream());

} catch (Exception ex) {
    connected = false;
    try {
        if (socket != null) {
            socket.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

EDİT:当我将连接从 WiFi 更改为互联网电缆时,套接字连接到新的 IP 地址。但我不知道为什么:(

【问题讨论】:

  • 检查你的防火墙,尝试ping这个IP地址
  • 这很可能与防火墙或 IP 地址不正确有关。
  • 您的计算机是否接受传入连接?我的没有。
  • 请显示您的本地计算机上的计算机网络配置工作正常,然后不工作。所以我们可以看到您的地址。
  • 这是一篇格式很好的帖子,也很有趣。所以,你在这里投赞成票。不要忘记通过单击左侧的管道图标来接受解决您问题的答案。

标签: java sockets network-programming client-server ip-address


【解决方案1】:

我正在尝试通过 IP 地址连接到服务器,但它不起作用。 两者都在同一台机器上,当我将 ipAddress 更改为 localhost 有用。那是什么原因呢?

原因是服务器代码中的 ServerSocket 未绑定到您尝试从客户端连接的 IP 地址。因此,在这种情况下,ServerSocket 绑定到默认环回地址,即localhost OR 127.0.0.1。

您需要编辑服务器端代码以在构造函数中将 ServerSocket 的 IP 地址与 IP(46.155.17.100) 绑定或稍后绑定。可以通过将 ServerSocket 初始化替换为以下内容来完成:

// int port = 4444, backlog = 5;
String bindaddr = "46.155.17.100";
ServerSocket server = new ServerSocket(port,backlog,InetAddress.getByName(bindAddr));
// your server-side code continues below.

【讨论】:

  • 无论他在哪里或如何绑定地址都无关紧要。该地址在他的内部网络中是不可路由的,除非他没有使用私有 IP 或对该地址有静态路由。
  • @Underbalanced - 您也不确定他是否连接到该网络。我知道是因为我见过新手反复问这个类似的问题。这可能是 OP 的公共地址!请注意,一旦我的话正确(OP接受答案),请删除您的反对票。
  • 我也同意这可能是 OP 的公共地址。他的细节确实欠缺。如果他在具有不同子网的 LAN 上。那他要怎么绑定他的路由器公网地址呢?
  • @Underbalanced - 好吧,你不应该按照自己的意愿假设一切。谁知道呢,我提到的可能是 OP 的情况!
【解决方案2】:

网络基础知识(概要):使用 IP 地址时,您的计算机将查看该 IP 是否与其自己的 NIC 位于同一子网上。如果不是,计算机将根据路由到您的默认网关(路由器)来确定地址的位置。因此,当您使用公共地址时,您会将流量从您的计算机发送到您的路由器,然后发送到 ISP/服务提供商,在那里它只是被路由回您的路由器 IP,因此您的路由器需要对流量开放端口 8082。使用 localhost 或 127.0.0.1 告诉您的计算机将其路由到自身。

In Steps:
Destination "46.155.17.100"
Computer is this in my local network?(My own network is 192.168.0.0/24) (My Address is 192.168.0.X)
    - This is not on my network, let me send it to my default gateway
Computer sends data to gateway -> 192.168.0.1 (router)
The Router says, is this on any network I know of?
        - Nope i do not own 46.155.17.100, -> Your router send data to its own default gateway which should be the (ISP Router)
ISP Router says hey i know where this is -> sends it back to your router.

【讨论】:

  • 添加此答案表明您不知道 SO 的回答方式/方式。 OP 不是在问网络的基础知识,他是在问代码中的错误!!! SO 不是理论上的 Networking Stack Exchange,它是一个与编程相关的网站。您需要在相关代码中回答OP的问题,这个答案几乎没有涉及!
【解决方案3】:

首先尝试“telnet 46.155.17.100 8802”。如果 telnet 无法连接到服务器,则问题出在服务器或防火墙上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多