【问题标题】:Android ServerSocketChannel binding to loopback addressAndroid ServerSocketChannel 绑定到环回地址
【发布时间】:2013-05-29 23:08:24
【问题描述】:

我有一台 Android 设备,它将运行其他 Android 设备(客户端)将连接到的服务器。我在非阻塞模式下使用SocketChannelServerSocketChannel

这是我在服务器设备上初始化 ServerSocketChannel 的代码: ServerSocketChannel 服务器SocketChannel; ServerSocket serverSocket;

        InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), 10000);

        serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.configureBlocking(false);

        serverSocket = serverSocketChannel.socket();
        serverSocket.bind(address);

        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        Log.i("AdminNetwork", serverSocket.getInetAddress().getHostAddress());

当客户端设备尝试连接到服务器设备时,连接超时并抛出带有 null 消息的 ConnectException。我调用Log.i() 来检查ServerSocket 绑定到的IP 地址。当代码执行时,输出显示 IP 地址为“127.0.0.1”。我在一个普通的 Java 应用程序中尝试了该代码,它打印了计算机的内部 IP 地址。当我在计算机上运行服务器时,客户端连接成功。

我认为问题在于ServerSocket绑定了环回地址,导致客户端连接失败。这是导致客户端超时的问题吗?如果是,我该如何解决?

【问题讨论】:

    标签: java android timeout connect nio


    【解决方案1】:

    这是一种可能。 InetAddress.getLocalHost().getHostAddress() 可以返回 127.0.0.1::1 或服务器本地的任何其他 IP 地址。

    只需传递null 而不是这个值:这相当于INADDR_ANY,它允许服务器通过其任何接口接受连接。

    【讨论】:

    • 测试了它并连接了客户端。谢谢!
    猜你喜欢
    • 2015-02-08
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多