0

HTTP サーバーをホストしている Android デバイスがあり、NATed (ルーターの背後) になっています。NAT されていない公開サーバーからアクセスしたい。スレッドのポート 8080 で Android デバイスの HTTP サーバーを実行し、しばらくしてから、Android のローカル ポート番号 8080 からリモート パブリック サーバーに接続しようとするクライアント スレッドを起動します。何らかの理由で、ポート 8080 でサーバーを起動した後、Android クライアントが接続しません。また、例外も発生しません。これが私のコードです:

Thread server = new Thread(new Runnable() {
public void run() {
    super.run();

    try {
        ServerSocket serverSocket = new ServerSocket();
        serverSocket.setReuseAddress(true);
        serverSocket.bind(new InetSocketAddress("192.168.1.102", 8080));

        while(isRunning){
            try {
                System.out.println("Listening for new connection");
                Socket socket = serverSocket.accept();
                System.out.println("incoming connection accepted");
                new Thread(new ConnectionHandler(socket)).start();    
            } catch (IOException e) {
                e.printStackTrace();
            }                             
        }
        serverSocket.close();
    } 
    catch (IOException e) {
        e.printStackTrace();
    }
}
});
server.start();



// sleep several seconds before launch of client
Thread.currentThread().sleep(5 * 1000);


Thread client = new Thread(new Runnable() {
public void run() {
    super.run();
    try {
        /* .. */
        Inet4Address localaddr = (Inet4Address) InetAddress
                .getByName("192.168.1.102");
        // Inet4Address remoteaddr = (Inet4Address)
        // InetAddress.getByName("122.176.73.10");
        System.out.println("connecting to 122.176.73.10");

        Socket socket = new Socket();

        socket.setReuseAddress(true);
        System.out.println("[Client]socket.isBound():" + socket.isBound());
        socket.bind(new InetSocketAddress("192.168.1.102", 8080));

        for (int i = 1; i < 5; i++) {
            try {
                socket.connect(new InetSocketAddress("122.176.73.10", 4040));
                System.out.println("connected to 122.176.73.10");
                break;
            } catch (Exception e) {
                System.out.println("[Client]fail to connect ");
                Thread.currentThread().sleep(i * 2 * 1000);
            }
        }
    }
}
});
client.start();
4

1 に答える 1

0

ポート番号を、着信接続のリッスンと発信接続の作成の両方に使用することはできません。リッスン ソケットがオンに8080なっていると、そのポートを使用する他の操作が妨げられます。

于 2013-02-10T09:29:15.863 に答える