2013-07-24 11 views
31

Ho 2 dispositivi Android, uno funge da server in modalità tethering e accetta le connessioni a una porta. L'altro dispositivo funge da client che si collega all'hotspot del server e stabilisce una connessione al server tramite una porta. (Tutto è fatto senza un router nel mezzo).Connessione Android alla presa di tethering

Il codice del server è simile al seguente: (Quando il server Android esegue il codice, il dispositivo è in modalità tethering)

ServerSocket server = new ServerSocket(PORT); 

while (true) { 
    Socket client; 
    client = server.accept(); 
    ClientThread com = new ClientThread(client, this); 
    Thread t = new Thread(com); 
    t.start(); 
} 

Il codice client è simile al seguente: (quando il client Android esegue questo codice, il dispositivo è connesso al punto di accesso)

Socket client = new Socket(); 
int serverIP = wifiManager.getDhcpInfo().serverAddress; 
String stringIP = android.text.format.Formatter.formatIpAddress(serverIP); 
InetAddress address = InetAddress.getByName(stringIP); 
SocketAddress socketAddress = new InetSocketAddress(address, PORT); 
client.connect(socketAddress); 

ottengo il seguente errore sul client

java.net.ConnectException: failed to connect to /192.168.43.1 (port 12345): connect failed: ENETUNREACH (Network is unreachable) 
    at libcore.io.IoBridge.connect(IoBridge.java:114) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
    at java.net.Socket.connect(Socket.java:842) 
    at java.net.Socket.connect(Socket.java:785) 
    at com.alternatewifimeshmessaging.HostManager.clientConnect(HostManager.java:283) 
    at com.alternatewifimeshmessaging.HostManager.client(HostManager.java:189) 
    at com.alternatewifimeshmessaging.HostManager.run(HostManager.java:59) 
    at java.lang.Thread.run(Thread.java:856) 
Caused by: libcore.io.ErrnoException: connect failed: ENETUNREACH (Network is unreachable) 
    at libcore.io.Posix.connect(Native Method) 
    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 
    at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
    at libcore.io.IoBridge.connect(IoBridge.java:112) 
... 8 more 

Il server non dà errori.

Ho il seguente set di autorizzazioni nel file manifest di Android:

<uses-permission android:name="android.permission.INTERNET" > 
</uses-permission> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > 
</uses-permission> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > 
</uses-permission> 

Idealmente mi avrebbe bisogno di trasferire alcuni dati dal server al client.

Cosa sto sbagliando?

risposta

14

Testando si scopre che la connessione non può essere stabilita sul dispositivo di tethering.

Ma se invertiamo il processo e apriamo un server sul client connesso. E connettersi ad esso dal dispositivo tethering, funzionerà.

Invertire la comunicazione è la risposta.

+0

Come posso farlo? –

2

Server Side

class ServerThread implements Runnable { 

    public void run() { 
     socket = new Socket(); 

     try { 
      serverSocket = new ServerSocket(SERVERPORT); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     while (!Thread.currentThread().isInterrupted()) { 
      try { 
        socket = serverSocket.accept(); 

       CommunicationThread commThread = new CommunicationThread(socket); 
       new Thread(commThread).start(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

lato client

class ClientThread implements Runnable { 

    @Override 
    public void run() { 
     try { 
      socket = new Socket(); 
      InetSocketAddress socketAddress = new InetSocketAddress(SERVER_IP, SERVERPORT); 
      socket.connect(socketAddress); 

      CommunicationThread commThread = new CommunicationThread(socket); 
      new Thread(commThread).start(); 

     } catch (UnknownHostException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
    } 
} 
1

In una connessione wifi tethered, provider di connessione non può funzionare come un client. Quindi abbiamo bisogno di implementare una connessione socket TCP bidirezionale. Utilizzare un socket del server con un numero di porta nel dispositivo in modalità tethering. Questo dispositivo funge da server. Nel dispositivo client, utilizzare il socket per accedere alla porta client con l'indirizzo IP.