Autore Topic: Il client su PC non si aggancia al Server sull'emulatore Android  (Letto 1165 volte)

Offline Rphil

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Sistema operativo:
    Windows 8
Il client su PC non si aggancia al Server sull'emulatore Android
« il: 09 Febbraio 2014, 19:43:04 CET »
0
Salve a tutti, mi chiamo Filippo e sono uno studente di Ingegneria. Sto lavorando a un progetto in ambito universitario. Ho conosciuto questo sito mediante ricerche su internet per trovare una soluzione al mio problema. Spero che le molte persone esperte nella programmazione android presenti su questo sito possano darmi un supporto nello sviluppo della mia applicazione.
Sto realizzando un'applicazione per Android con Eclipse ADT in Java che deve fungere da Server e ricevere alcuni dati da un client PC connesso alla mia stessa rete mediante wifi.
Ho dapprima fatto un programma java che funzioni su PC e ho testato la comunicazione, che in questo caso avviene correttamente. Quando invece ho trasferito con i dovuti accorgimenti lo stesso codice per realizza l'app per android, ci sono dei problemi. L'app si setta da server e attende una connessione, tuttavia il PC remoto non riesce a connettersi al server che si trova sull'emulatore Android e lancia le seguenti eccezioni:

Grave:null
java.netConnectException: Connection timed out: connect
at java.net.TwoStacksPlainSocketImpl.socketConnect<Native Method>
at java.net.AbstractPlainSocketImpl.doConnect<Unknown source>
at java.net.AbstractPlainSocketImpl.connectToAddress<Unknown source>
at java.net.AbstractPlainSocketImpl.connect<Unknown source>
at java.net.PlainSocketImpl.connect<Unknown source>
at java.net.SocksSocketImpl.connect<Unknown source>
at java.net.Socket.connect<Unknown source>
at java.net.Socket.connect<Unknown source>
at java.net.Socket.<init><Unknown source>
at java.net.Socket.<init><Unknown source>

Ho provato a fare vari reindirizzamenti di porte con telnet, ma i risultati sono stati vani. Qualcuno saprebbe aiutarmi a risolvere questo problema? Ringrazio in anticipo.

Elenco di seguito i codici per il server e per il client:
SERVER:
Codice: [Seleziona]
protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_receive_image);
                // Show the Up button in the action bar.
                Intent intent = getIntent();
                   String message = intent.getStringExtra(DisplayParametriActivity.EXTRA_COUNTERX);
                    counterX=Integer.parseInt(message);
                    message = intent.getStringExtra(DisplayParametriActivity.EXTRA_COUNTERY);
                    counterY=Integer.parseInt(message);
                    updateConversationHandler = new Handler();
                            this.serverThread = new Thread(new ServerThread());
                            this.serverThread.start();

                setupActionBar();
        }

class ServerThread implements Runnable {
                        public void run() {
                                try {
                                            // 1. creating a server socket
                                            providerSocket = new ServerSocket(2005, 10);
                                            // 2. Wait for connection
                                            TextView textViewToChange1 = (TextView) findViewById(R.id.textView1);
                                     textViewToChange1.setText("Waiting for connection");
                                            connection = providerSocket.accept();
                                            textViewToChange1.setText("Connection received from "
                                                            + connection.getInetAddress().getHostName());
                                            // 3. get Input and Output streams
                                            out = new ObjectOutputStream(connection.getOutputStream());
                                            out.flush();
                                            in = new ObjectInputStream(connection.getInputStream());
                                            //sendMessage("Connection successful");
                                            // 4. The two parts communicate via the input and output streams
                                           
                                                    try {
                                                            message = (String) in.readObject();
                                                            textViewToChange1.setText("client>" + message);
                                                           
                                                    } catch (ClassNotFoundException classnot) {
                                                            System.err.println("Data received in unknown format");
                                                    }
                                           
                                    } catch (IOException ioException) {
                                            ioException.printStackTrace();
                                    }
                        }
        }

CLIENT SU PC (l'indirizzo ip a cui si connette è quello della macchina su cui gira il mio emulatore android):
Codice: [Seleziona]
try {
                    Thread.sleep((2000));
                } catch (InterruptedException ex) {
                    Logger.getLogger(WirlessController.class.getName()).log(Level.SEVERE, null, ex);
                }
               //LEGGI DATI DA FILE
                ReadFile scansione= new ReadFile();
                 String datisensore=new String();
            try {
            datisensore = scansione.getMatrix("C:\\dati.txt");
        }
            catch (IOException ex) {
            Logger.getLogger(WirlessController.class.getName()).log(Level.SEVERE, null, ex);
            datisensore= "no data available";
        }
            //CREA UNA NUOVA CONNESSIONE E INVIA DATI
                connection = new Socket("192.168.1.102", 2005);
                System.out.println("Connected to localhost in port 2005");
                //2. get Input and Output streams
                out = new ObjectOutputStream(connection.getOutputStream());
                out.flush();
                in = new ObjectInputStream(connection.getInputStream());
                //3: Communicating with the server
                sendMessage(datisensore);
            } catch (IOException ex) {
                Logger.getLogger(WirlessController.class.getName()).log(Level.SEVERE, null, ex);
            }
            finally{
                        //4: Closing connection
                        try{
                                in.close();
                                out.close();
                                connection.close();
                        }
                        catch(IOException ioException){
                                ioException.printStackTrace();
                        }
                }
« Ultima modifica: 09 Febbraio 2014, 20:12:13 CET da Rphil, Reason: Aggiunta eccezione »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Il client su PC non si aggancia al Server sull'emulatore Android
« Risposta #1 il: 10 Febbraio 2014, 07:18:22 CET »
0
Sicuramente sbagli IP, perché l'emulatore non risponde all'IP della macchina su cui gira. È diretto il NAT della macchina virtuale. Leggiti le istruzioni sull'uso dell'emulatore sul sito ufficiale, su come impostare una regola di inoltro.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Rphil

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Sistema operativo:
    Windows 8
Re:Il client su PC non si aggancia al Server sull'emulatore Android
« Risposta #2 il: 10 Febbraio 2014, 14:49:31 CET »
0
Salve bradipao, grazie per il suggerimento, ho provato a seguire le istruzioni date al seguente indirizzo: Using the Emulator | Android Developers ma il risultato purtroppo è identico, il client non riesce ad agganciarsi. Credo anche io che sia un problema di mascheramento dell'IP, tuttavia non riesco a risolverlo in questo modo. Ho provato anche ad utilizzare due porte diverse per server e client e fare il reindirizzamento con telnet, ma senza risultati.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Il client su PC non si aggancia al Server sull'emulatore Android
« Risposta #3 il: 10 Febbraio 2014, 15:12:48 CET »
0
Salve bradipao, grazie per il suggerimento, ho provato a seguire le istruzioni date al seguente indirizzo: Using the Emulator | Android Developers ma il risultato purtroppo è identico, il client non riesce ad agganciarsi. Credo anche io che sia un problema di mascheramento dell'IP, tuttavia non riesco a risolverlo in questo modo. Ho provato anche ad utilizzare due porte diverse per server e client e fare il reindirizzamento con telnet, ma senza risultati.

Facendo un attimo un passo indietro, il concetto di fondo è che un'app (o meglio un terminale android) non è proprio pensato per fare da server. Per esempio tieni conto che in connessione 3G il terminale si trova dietro così tanti NAT (di sicuro più di uno) per cui non sarà mai accessibile tramite IP diretto. In WI-FI lo sarà nella stessa rete locale in cui si trova, ma appena ne esci nasce nuovamente il problema del NAT.

Assumo quindi che lo sviluppo di un'app che faccia da server sia essenzialmente "per ricerca". Se così è, potresti provare a far girare l'app su un terminale fisico e quindi accedervi direttamente da IP di rete locale, così escludi del tutto i problemi dovuti ai NAT. Se anche in questo modo non funziona, allora c'è qualche altra cosa oltre al mascheramento dell'IP.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Rphil

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Sistema operativo:
    Windows 8
Re:Il client su PC non si aggancia al Server sull'emulatore Android
« Risposta #4 il: 10 Febbraio 2014, 20:26:25 CET »
0
Grazie mille bradipao, non ero a conoscenza di questo dettaglio.