Autore Topic: Problema ServerSocket  (Letto 797 volte)

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Problema ServerSocket
« il: 10 Agosto 2014, 11:43:50 CEST »
0
Ciao ragazzi,
ho un problema riguardante l'utilizzo del ServerSocket...
In pratica sto cercando di fare una semplicissima app che apre una ServerSocket e rimane li in ascolto, in attesa di una connessione...poi eventualmente riceve una stringa e la stampa.

Il meccanismo è molto semplice, appena viene cliccato un bottone, viene creato un Thread(che si occupa di gestire la ServerSocket) e richiamato il suo rispettivo metodo start()...ecco il codice del metodo che cattura il click del bottone:
Codice (Java): [Seleziona]
public void onClickRiceviStringa(View view){
                WorkerThreadServer thread = new WorkerThreadServer();
                thread.start();
               
        }

e del thread che viene creato:
Codice (Java): [Seleziona]
public class WorkerThreadServer extends Thread{
                final String LOG = "classe WorkerThreadServer";
                                       
                public void start(){
                        Log.i(LOG,"inizio metodo start");
                        super.start();
                        }
                public void run(){
                        Log.i(LOG,"inizio metodo run()");
                        ServerSocket serverSocket = null;
                        Socket s = null;
                        try{
                          serverSocket = new ServerSocket(10324);
                          Log.i(LOG,"socket istanziata!");
                          while(true){
                                  Log.i(LOG,"In attesa di connessione.....");
                                  s = serverSocket.accept();
                                  Log.i(LOG,"Connessione ricevuta!!");
                                 
                          }//fine while
                }catch(Exception e){Log.e(LOG,"Eccezione: "+e.toString());}
        }
        }


In pratica il problema è che il thread si blocca sul comando "s = serverSocket.accept()" in attesa di ricevere una connessione, ma anche se gli invio comandi tramite un client, non li riceve e rimane sempre bloccato li. Infatti stampa il Log "In attesa di connessione..." ma non stampa mai il Log "Connessione ricevuta!".....
Il client è una semplicissima applicazione java, ecco il codice se può essere utile:
Codice (Java): [Seleziona]
public class Client{
public static void main(String[]args){
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try {
        socket = new Socket("192.168.1.3", 10324);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream.writeUTF("Questa e’ una prova");
} catch(UnknownHostException e) {
        } catch (IOException e) {
                } finally{
                        if (socket != null){
                                try {
        socket.close();
        } catch(IOException e) {
                } } if(dataOutputStream != null){
                        try {

dataOutputStream.close();
} catch (IOException e) {
        } }
                if (dataInputStream != null){
                        try {
dataInputStream.close();
} catch (IOException e) {
 } } }


}}

Inoltre la stessa app ha anche un altro bottone che se cliccato apre una Socket e invia una stringa e un'altra semplicissima applicazione java che funge da server(molto simile a questa client che ho postato) la riceve correttamente.....

Vi chiedo gentilmente se sapete quale potrebbe essere il problema... :-\ :-\

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Problema ServerSocket
« Risposta #1 il: 12 Agosto 2014, 17:59:56 CEST »
0
Ciao,
così a intuizione, tu sei certo che il canale è in ascolto ?
Prova a sostituire 
Codice: [Seleziona]
s = serverSocket.accept(); con questo:
Codice: [Seleziona]
Socket s= serverSocket.accept();
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Problema ServerSocket
« Risposta #2 il: 12 Agosto 2014, 19:45:53 CEST »
0
Ho provato ma niente...... :-\

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Problema ServerSocket
« Risposta #3 il: 12 Agosto 2014, 21:13:32 CEST »
0
In rete ho trovato molti tutorial prova a dare un occhio a quelli.
Se non sbaglio anche qui nel forum ho trovato qualcosa.
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Problema ServerSocket
« Risposta #4 il: 13 Agosto 2014, 12:15:03 CEST »
0
In rete ho trovato questo esempio molto ben spiegato...
http://examples.javacodegeeks.com/android/core/socket-core/android-socket-example/

In questo esempio ho visto che utilizza lo stesso meccanismo il server....In pratica viene istanziata una "ServerSocket" e poi viene invocato il metodo appropriato "ServerSocket.accept()" che non fa altro che rimanere bloccato in attesa di ricevere una connessione da parte di un socket (client) e appena la riceve ritorna la socket stessa.
Ho notato però che per fare funzionare il tutto oltre che avviare le due applicazioni in due Emulatori differenti, apre anche una connessione telnet da terminale..
Per quale motivo e come funziona?
La mia app oltre a ricevere dati(fungere da server-->anche se questa parte non funziona ) invia anche una stringa ad un server(semplicissima applicazione java) tramite una socket(cioè funge anche da client) e funziona perfettamente anche dal tablet(oltre che dall'emulatore) senza aprire connessione telnet da terminale...

Qualcuno saprebbe spiegarmi?

Vi ringrazio molto per la disponibilità...
« Ultima modifica: 13 Agosto 2014, 17:21:43 CEST da christian13 »

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Problema ServerSocket
« Risposta #5 il: 14 Agosto 2014, 01:08:42 CEST »
0
Quando tu avvii un emulatore , come puoi vedere gli viene assegnata una porta , solitamente 5554.
Con telnet puoi inviare all'emulatore con quella porta, dei messaggi, in pratica simuli il client.

Puoi dare un occhio a questo link:
https://sites.google.com/site/androidhowto/how-to-1/connect-send-commands-to-your-android-emulator
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Problema ServerSocket
« Risposta #6 il: 14 Agosto 2014, 10:45:48 CEST »
0
A quanto pare il problema per cui non funziona credo che sia perche l'emulatore di Android apre una porta(solitamente numero 5554) e il mio client java apre una socket con porta "10324" (quella in cui resta in ascolto l'app android server).
In teoria credo che dovrei mettere in ascolto anche la porta dell'emulatore(la 5554)....
Ma non ho ben capito come funzioni il meccanismo..
Qualcuno per caso saprebbe come risolvere il problema..?
« Ultima modifica: 14 Agosto 2014, 19:23:04 CEST da christian13 »

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Problema ServerSocket
« Risposta #7 il: 18 Agosto 2014, 11:58:13 CEST »
0
Vi chiedo gentilmente se qualcuno potrebbe aiutarmi, non so più cosa provare...
In pratica la mia app all'avvio(metodo onCreate) crea una WorkerThreadServer(un nuovo thread) che istanzia una ServerSocket e resta in attesa di una connessione.... Vi posto il codice della classe WorkerThreadServer:
Codice (Java): [Seleziona]
public class WorkerThreadServer extends Thread{
                final String TAG = "WorkerThreadServer class";
                public void start(){
                       
                        Log.i(TAG,"start() method");
                        super.start();
                }
               
                public void run(){
                        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
                        try{
                                socketServer = new ServerSocket(10324);
                                Log.i(TAG,"in attesa di connessione....");
                                Socket socket = socketServer.accept();
                                Log.i(TAG,"connessione ricevuta....!");
                                Log.i(TAG,"dati del client..."+socket.getLocalPort());
                               
                               
                        }catch(Exception e){
                                Log.i(TAG,"eccezione="+e.toString());
                        }
                }
               
        }

Questo invece il codice del client....una semplicissima applicazione java..:
Codice (Java): [Seleziona]
Socket socket = null;
                        DataOutputStream dataOutputStream = null;
                        DataInputStream dataInputStream = null;
                        try {
                                //InetAddress inetAddress = new InetAddress();
                        socket = new Socket("192.168.56.1",10324);
                        dataOutputStream = new DataOutputStream(socket.getOutputStream());
                        dataInputStream = new DataInputStream(socket.getInputStream());
                        dataOutputStream.writeUTF("Questa e’ una prova"); }
                        catch(UnknownHostException e) {
                                e.printStackTrace();
                        } catch(IOException e) {
                                e.printStackTrace();
                        } finally{
                                if (socket != null){
                                        try {
                         socket.close();
                         } catch(IOException e) { e.printStackTrace();
                         } } if (dataOutputStream != null){
                                 try {
                        dataOutputStream.close();
                        } catch (IOException e) {
                         } }
                         if (dataInputStream != null){
                                 try {
                        dataInputStream.close();
                        } catch (IOException e) {
                                e.printStackTrace();
                                } } }
Inoltre all'interno dell'app c'è anche un WorkerThreadClient che funziona benissimo, invia correttamente una stringa a un server java....
Il problema è che nel WorkerThreadServer viene stampato il LOG "Log.i(TAG,"in attesa di connessione....");" ma poi si blocca su serverSocket.accept(); non riceve nessuna connessione (quindi non viene mai stampato il LOG "Log.i(TAG,"connessione ricevuta....!");"....


Vi chiedo gentilmente se potete aiutarmi, ve ne sarei veramente molto grado....

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Problema ServerSocket
« Risposta #8 il: 19 Agosto 2014, 11:09:43 CEST »
0
Ma lato app client cosa succede ?
Va in errore ?
RImane in attesa ?
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Problema ServerSocket
« Risposta #9 il: 19 Agosto 2014, 11:27:13 CEST »
0
No assolutamente.
Lato app, il client è sempre una classe che estende Thread(meccanismo molto simile al server dell'app) che invia una stringa (e in questo caso il server è un'applicazione java che riceve correttamente la stringa...quindi funziona perfettamente).
Il problema è solo nel lato server dell'app, rimane bloccato su serverSocket.accept() e non riceve nessuna connessione....

Sapete da cosa potrebbe dipendere?