1

他の Android デバイス (クライアント) が接続するサーバーを実行する Android デバイスがあります。ノンブロッキングモードでSocketChannelandを使用しています。ServerSocketChannel

サーバー デバイスで ServerSocketChannel を初期化するためのコードは次のとおりです。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 がループバック アドレスにバインドされ、クライアント接続が失敗することだと思います。これがクライアントのタイムアウトを引き起こす問題ですか? もしそうなら、どうすれば修正できますか?

4

1 に答える 1

2

それは可能性です。または、サーバーに対してローカルな他の IP アドレスのいずれかを返すInetAddress.getLocalHost().getHostAddress()ことができます。127.0.0.1::1

この値の代わりに渡すだけnullです。これは と同等INADDR_ANYであり、サーバーはそのインターフェースのいずれかを介して接続を受け入れることができます。

于 2013-05-30T00:13:39.923 に答える