Autore Topic: Trasmissione stringa da client Android a server Java.  (Letto 581 volte)

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Trasmissione stringa da client Android a server Java.
« il: 21 Settembre 2014, 11:27:59 CEST »
0
Ciao ragazzi, ho un problema....quello che devo fare è un semplicissimo client [Android] che comunica con un semplicissimo Server [java]....una sorta di chat utilizzando le socket..
Il client Android appena si avvia deve connettersi con il server e dopo, ogni volta che viene premuto un bottone, inviare una stringa al server...
Per quanto riguarda il client Android ecco il codice:

Codice (Java): [Seleziona]
public class MainActivity extends Activity {

DataOutputStream dataOutputStream;

Button inviaStringa;

        @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        dataOutputStream = null;

        new Connection().start();    //avvio il thread secondario che connette la socket e gli stream di lettura/scrittura

        inviaStringa = (Button)findViewById(R.id.button);

     

        inviaStringa.setOnClickListener(new OnClickListener() {

                                 public void onClick(View v) {

                                   if(dataOutputStream!=null){

                                      try{

                                       dataOutputStream.writeUTF("stringa da inviare");

                       }catch(Exception e){

                                // TODO Auto-generated catch block

                                e.printStackTrace();

}

}

                        }

    });









    }

   

   

   

    public class Connection extends Thread{

        Socket socket;

        DataInputStream dataInputStream;

        public Connection(){

                socket = null;

                dataOutputStream = null;

        }

       

        public void run(){

                try {

                                socket = new Socket("192.168.1.8",8080);

                                dataOutputStream = new DataOutputStream(socket.getOutputStream());

                                dataInputStream = new DataInputStream(socket.getInputStream());

                               

                        } catch (UnknownHostException e) {

                                // TODO Auto-generated catch block

                                e.printStackTrace();

                        } catch (IOException e) {

                                // TODO Auto-generated catch block

                                e.printStackTrace();

                        }



while(true){

try{

String input = dataInputStream.readLine();

//stampa la stringa input su qualche TextView...

}catch(IOException){

// TODO Auto-generated catch block

                                e.printStackTrace();

}

}





        }

       

       

    }

mentre il codice del server java è il seguente:


Codice (Java): [Seleziona]
public class Server {

public static void main(String args[]){

       

        ServerSocket serverSocket;

        Socket socket;

        DataInputStream dataInputStream;

       

       

        try {

                serverSocket = new ServerSocket(8080);

                System.out.println("in attesa di connessione");

                socket = serverSocket.accept();

                System.out.println("connessione ricevuta");

                dataInputStream = new DataInputStream(socket.getInputStream());

     While(true){

                System.out.println(dataInputStream.readLine().toString());

                    }

        } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

        }

       

       

}

}




Il problema è che il server riceve regolarmente la connessione, però non riceve alcuna stringa dal client android....Infatti se sul client premo molte volte il bottone, il server non riceve la stringa....
in pratica il server java rimane fermo su "System.out.println(dataInputStream.readLine().toS tring());"

La cosa più strana è che entrambi funzionano correttamente separati, cioè se faccio connettere un client telnet al server java, quest'ultimo riceve regolarmente le stringe inviategli, mentre se collego il client android a un server telent, quest'ultimo ugualmente riceve le stringhe in modo corretto ogni volta che premo il bottone del client....
In pratica non vengono inviate o ricevute le stringhe solo quando vengono connessi tra di loro.... :-(

Sapete il motivo?
La cosa importante è che il thread secondario(che si occupa dell'istanza della socket) venga avviato solo all'inizio e quindi anche la socket venga istanziata una sola volta...Quando premo il bottone deve essere solo inviata la stringa...Inoltre il thread secondario si occupa di rimanere in attesa di ricevere una stringa(poi stamparla o gestirla ecc...).

vi ringrazio molto....
« Ultima modifica: 23 Settembre 2014, 11:14:24 CEST da christian13 »

Offline alfy91

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +2
    • @piscitelli91
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 8
Re:Trasmissione stringa da client Android a server Java.
« Risposta #1 il: 14 Ottobre 2014, 10:32:40 CEST »
0
Prova a fare così:

Citazione
dataOutputStream.writeUTF("stringa da inviare\n");

Il server legge la linea che finisce con lo "\n".
Facci sapere.

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Trasmissione stringa da client Android a server Java.
« Risposta #2 il: 14 Ottobre 2014, 10:44:46 CEST »
0
Ciao e grazie molto per la risposta.
Comunque la soluzione era abbastanza semplice.

Ho utilizzato da entrambi i lati:

Codice (Java): [Seleziona]
BufferedReader in = new BufferedReader(new InputStreamReader(   socket.getInputStream()));
BufferedWriter out = out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

per inviare la stringa:
Codice (Java): [Seleziona]
out.write(stringa + "\n");
out.flush();

per leggere la stringa:
Codice (Java): [Seleziona]
in.readLine()
Funziona perfettamente... :-)

Offline alfy91

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +2
    • @piscitelli91
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 8
Re:Trasmissione stringa da client Android a server Java.
« Risposta #3 il: 14 Ottobre 2014, 11:08:29 CEST »
0
Si, perché come ti spiegavo utilizzando lato server la readline, il programma rimane in attesa finché non legge il carattere di fine linea, che generalmente è \n
Ecco perché ti sembrava in attesa perenne  :D
Ciao!

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Trasmissione stringa da client Android a server Java.
« Risposta #4 il: 14 Ottobre 2014, 11:11:01 CEST »
0
Si effettivamente ero stato un po sbadato io... :-)


Comunque grazie per la collaborazione... ;-)