Autore Topic: Connessione ad ip remoto via socket  (Letto 726 volte)

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Connessione ad ip remoto via socket
« il: 07 Agosto 2014, 19:46:24 CEST »
0
Salve, sto sviluppando un'app che trasmette dati tra un server ed un client tramite una socket. Il client è un device Android.
Se uso l'emulatore di Eclipse non ci sono problemi, se però provo ad usare il mio cellulare ho un problema strano: uso DataInput/OutputStream per inviare e ricevere dati. Dopo la accept, il server riceve dallo smartphone una stringa e gli restituisce un intero. Fin qui funziona tutto bene.
Poi non appena lo smartphone esegue una readUTF dalla socket viene sollevata l'eccezione EOFException.
Sapete da cosa potrebbe dipendere? Ho letto che il firewall del router potrebbe creare problemi ma penso che in tal caso non funzionerebbe proprio la connessione, invece dei dati io riesco ad inviarli.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1231
  • Respect: +60
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Connessione ad ip remoto via socket
« Risposta #1 il: 08 Agosto 2014, 02:05:14 CEST »
0
Logcat e codice usato.
Ripeto sempre...ricordati di mettere i permessi nel manife anche se lo avrai fatto

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Re:Connessione ad ip remoto via socket
« Risposta #2 il: 08 Agosto 2014, 13:23:03 CEST »
0
Sì, sì, i permessi ci sono (anche perché altrimenti la versione emulata non dovrebbe comunque funzionare). Il logcat è questo:
Codice: [Seleziona]
08-08 13:16:49.830: E/ClientActivity(12332): java.io.EOFException
08-08 13:16:49.830: E/ClientActivity(12332):         at libcore.io.Streams.readFully(Streams.java:83)
08-08 13:16:49.830: E/ClientActivity(12332):         at java.io.DataInputStream.readFully(DataInputStream.java:120)
08-08 13:16:49.830: E/ClientActivity(12332):         at java.io.DataInputStream.decodeUTF(DataInputStream.java:195)
08-08 13:16:49.830: E/ClientActivity(12332):         at java.io.DataInputStream.decodeUTF(DataInputStream.java:190)
08-08 13:16:49.830: E/ClientActivity(12332):         at java.io.DataInputStream.readUTF(DataInputStream.java:186)
08-08 13:16:49.830: E/ClientActivity(12332):         at com.example.testclient.ActivityIniziale$ClientThread.run(ActivityIniziale.java:92)
08-08 13:16:49.830: E/ClientActivity(12332):         at java.lang.Thread.run(Thread.java:841)

Per le parti di codice rilevanti, quella del server è:
Codice (Java): [Seleziona]
System.out.println("Attesa connessione");
                                                connection = serverSocket.accept();
                                                System.out.println("Aperta connessione");

                                                DataInputStream in = new DataInputStream(connection.getInputStream());
                                                DataOutputStream out = new DataOutputStream(connection.getOutputStream());

                                                String temp = in.readUTF();
                                                System.out.println(temp);
                                                if( temp.equals(getNumber)){
                                                        /*Gestione iniziale*/

                                                        out.write(numberOfSites);
                                                        out.flush();


                                                        for(i = 0; i < numberOfSites; i++){
                                                                /*Invio le info ed attendo la risposta*/
                                                                out.writeUTF(folderList.nameArray[i]);
                                                                out.flush();

                                                                out.writeInt(folderList.numberArray[i]);;
                                                                out.flush();

                                                                bos = new ByteArrayOutputStream();
                                                                img = ImageIO.read(folderList.imagesArray[i]);
                                                                ImageIO.write( img, "jpg", bos );

                                                                imageInByte = bos.toByteArray();
                                                                bos.close();

                                                                out.writeInt(imageInByte.length);
                                                                out.flush();

                                                                out.write(imageInByte);
                                                                out.flush();
                                                        }
                                                }
Quella del client è:
Codice (Java): [Seleziona]
Socket s = ConnectionClass.createSocket();
                                if (s == null){
                                        Log.e("asd", "Impossibile connettersi al server");
                                        return;
                                }
                               
                                out = new DataOutputStream(s.getOutputStream());                       
                                in = new DataInputStream(s.getInputStream());
                               
                                                               
                                /*Si richiede la lista delle immagini*/
                                out.writeUTF(getNumber);                               
                                out.flush();
                               
                                numeroDiSiti = in.read();
                                listaSiti = new Element[numeroDiSiti];
                                Log.v("asd", "Numero di siti disponibili " + numeroDiSiti);
                                byte[] buffer;
                               
                                for(i = 0; i < numeroDiSiti; i++){
                                        /*Mi arrivano, in ordine, il nome, il numero di immagini, la lunghezza del logo ed il logo stesso*/
                                        listaSiti[i] = new Element();
                                       
                                        listaSiti[i].setName(in.readUTF());
                                       
                                        listaSiti[i].setNImmagini(in.readInt());
                                       
                                        temp = in.readInt();
                                        buffer = new byte[temp];
                                        in.read(buffer);
                                       
                                        listaSiti[i].setImage(BitmapFactory.decodeByteArray(buffer, 0, buffer.length));

                                }
Nel codice del client "Log.v("asd", "Numero di siti disponibili " + numeroDiSiti);" lo stampa con i dati corretti, quindi non capisco dove possa risiedere il problema.

ps: nota che reputo interessante: tutto questo vale usando il wi-fi, se invece uso la connessione dati ottengo come errore
Codice: [Seleziona]
08-08 13:26:12.020: V/asd(13000): java.net.ConnectException: failed to connect to /192.168.1.4 (port 53650): connect failed: ETIMEDOUT (Connection timed out)
08-08 13:26:12.020: V/asd(13000):         at com.example.testclient.ConnectionClass.createSocket(ConnectionClass.java:39)
08-08 13:26:12.020: V/asd(13000):         at com.example.testclient.ActivityIniziale$ClientThread.run(ActivityIniziale.java:68)
08-08 13:26:12.020: V/asd(13000):         at java.lang.Thread.run(Thread.java:841)
08-08 13:26:12.020: V/asd(13000): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
08-08 13:26:12.020: V/asd(13000):         at libcore.io.Posix.connect(Native Method)
08-08 13:26:12.020: V/asd(13000):         at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
08-08 13:26:12.020: V/asd(13000):         at libcore.io.IoBridge.connectErrno(IoBridge.java:131)
08-08 13:26:12.020: V/asd(13000):         at libcore.io.IoBridge.connect(IoBridge.java:116)
08-08 13:26:12.020: V/asd(13000):         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
08-08 13:26:12.020: V/asd(13000):         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
08-08 13:26:12.020: V/asd(13000):         at java.net.Socket.startupSocket(Socket.java:570)
08-08 13:26:12.020: V/asd(13000):         at java.net.Socket.tryAllAddresses(Socket.java:132)
08-08 13:26:12.020: V/asd(13000):         at java.net.Socket.<init>(Socket.java:182)
08-08 13:26:12.020: V/asd(13000):         at java.net.Socket.<init>(Socket.java:154)
08-08 13:26:12.020: V/asd(13000):         at com.example.testclient.ConnectionClass.createSocket(ConnectionClass.java:30)
08-08 13:26:12.020: V/asd(13000):         ... 2 more
08-08 13:26:12.020: E/asd(13000): Impossibile connettersi al server
senza quindi riuscire a stabilire una connessione con il server.
A scanso di equivoci, il permesso inserito nel manifest è
Codice: [Seleziona]
<uses-permission android:name="android.permission.INTERNET" />
« Ultima modifica: 08 Agosto 2014, 13:29:57 CEST da Ilgard »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1231
  • Respect: +60
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Connessione ad ip remoto via socket
« Risposta #3 il: 08 Agosto 2014, 13:30:42 CEST »
0
Non so niente sui socket. Comunque stampa nel log l'eccezione con e.toString()

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Re:Connessione ad ip remoto via socket
« Risposta #4 il: 13 Agosto 2014, 11:24:35 CEST »
0
Con il 3G attivato:
Codice: [Seleziona]
08-13 11:20:50.736: V/asd(30629): java.net.ConnectException: failed to connect to /192.168.1.5 (port 53650): connect failed: ETIMEDOUT (Connection timed out)
08-13 11:20:50.736: E/asd(30629): Impossibile connettersi al server


Con il wi-fi:
Codice: [Seleziona]
08-13 11:23:07.953: E/ClientActivity(31542): java.io.EOFException
08-13 11:23:07.953: E/ClientActivity(31542):         at libcore.io.Streams.readFully(Streams.java:83)
08-13 11:23:07.953: E/ClientActivity(31542):         at java.io.DataInputStream.readInt(DataInputStream.java:124)
08-13 11:23:07.953: E/ClientActivity(31542):         at com.example.testclient.ActivityIniziale$ClientThread.run(ActivityIniziale.java:96)
08-13 11:23:07.953: E/ClientActivity(31542):         at java.lang.Thread.run(Thread.java:841)
08-13 11:23:54.933: E/ClientActivity(31693): C: Error
08-13 11:23:54.933: E/ClientActivity(31693): java.io.EOFException
08-13 11:23:54.933: E/ClientActivity(31693):         at libcore.io.Streams.readFully(Streams.java:83)
08-13 11:23:54.933: E/ClientActivity(31693):         at java.io.DataInputStream.readFully(DataInputStream.java:120)
08-13 11:23:54.933: E/ClientActivity(31693):         at java.io.DataInputStream.decodeUTF(DataInputStream.java:195)
08-13 11:23:54.933: E/ClientActivity(31693):         at java.io.DataInputStream.decodeUTF(DataInputStream.java:190)
08-13 11:23:54.933: E/ClientActivity(31693):         at java.io.DataInputStream.readUTF(DataInputStream.java:186)
08-13 11:23:54.933: E/ClientActivity(31693):         at com.example.testclient.ActivityIniziale$ClientThread.run(ActivityIniziale.java:92)
08-13 11:23:54.933: E/ClientActivity(31693):         at java.lang.Thread.run(Thread.java:841)