Autore Topic: Server Java - Client Android - Send file da Server a Client con socket  (Letto 4478 volte)

Offline flaviocapaccio

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung I5800 (Galaxy mini)
  • Sistema operativo:
    Windows xp
Buonasera a tutti; sto avendo problemi con un programma client server in cui ho un server java che invia un file ad un terminale android; utilizzo la readobject e la writeobject tuttavia sul terminale ricevo un file di 0 byte e non riesco a capire dove sbaglio.

Il codice del server è questo:
Codice (Java): [Seleziona]
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
 
 
public class Server {
 
  private final int SERVER_PORT = 9977;
 
  public static void main(String[] args) {
      Server s = new Server();
      try {
          s.listen();
      } catch (IOException e) {
          e.printStackTrace();
      }
  }
 
  private void listen() throws IOException {
      ServerSocket ss = new ServerSocket(SERVER_PORT);
      System.out.println("Sono sulla " + ss);
 
      // ciclo infinito per accettare per sempre connessioni
      for (;;) {
          // prendo la connessione in ingresso
          Socket s = ss.accept();
          System.out.println("Conessione da " + s);
 
          // creo ed eseguo il thread per questa connessione
          // cosi il ciclo continua e rimane in attesa di
          // nuove connessioni
          new SenderManager(s).run();
 
          // faccio respirare un po il ciclo
          try {
              Thread.sleep(100);
          } catch (InterruptedException e) { }
      }
  }
}

Il server mi richiama una classe SenderManager che mi permette di istanziare un thread separato per ogni connessione:
Codice (Java): [Seleziona]
import java.io.File;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;


public class SenderManager implements Runnable{
        private Socket socket;

        public SenderManager(Socket socket){
                this.socket = socket;
        }

        public void run() {
                File file = new File("c:\\a.jpg");
                try {
                        ObjectOutputStream oos;
                        oos = new ObjectOutputStream(socket.getOutputStream());
                        oos.reset();
                        oos.writeObject(file);
                        oos.flush();
                        oos.close();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }      
        }
}

Invece per il terminale android il codice è il seguente:
Codice (Java): [Seleziona]
package it.flaviocapaccio.clientimmagini;

import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class ClientAndroidActivity extends Activity {
   
    private final static String SERVER_HOST = "192.168.42.1";
        private final static int SERVER_PORT = 9977;
       
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Socket socket = null;
        try {
                        socket = new Socket(InetAddress.getByName(SERVER_HOST), SERVER_PORT);
                        Log.i("TCP", "Sei connesso a " + SERVER_HOST + ":" + SERVER_PORT);
                        ObjectInputStream oos;
                        socket.getOutputStream();
                        oos = new ObjectInputStream(socket.getInputStream());
                        File file = (File) oos.readObject();
                        oos.close();
                        Log.i("TCP", "File length: " + file.length());
                } catch (UnknownHostException e) {
                        Log.i("TCP", "Errore connessione a " + SERVER_HOST + ":" + SERVER_PORT);
                        e.printStackTrace();
                } catch (IOException e) {
                        Log.i("TCP", "Errore connessione a " + SERVER_HOST + ":" + SERVER_PORT);
                        e.printStackTrace();
                } catch (ClassNotFoundException e) {
                        Log.i("TCP", "ReadObject non riesce a riconoscere il tipo di oggetto. Classe non riconosciuta");
                        e.printStackTrace();
                }
    }
}

Ho inserito il permesso di uso della rete nel manifest con la seguente riga: <uses-permission android:name="android.permission.INTERNET"/>

Spero che qualcuno riuscirà ad aiutarmi!

Ringrazio anticipatamente!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #1 il: 13 Dicembre 2011, 23:09:56 CET »
0
Non credo che funzioni facendo in questo modo.
Quando crei  un oggetto File dubito che quest'ultimo contenga tutti i byte del file che rappresenta.
Dovresti andare a leggere direttamente i byte del file e mandarli o creare una stringa base64 a partire da quest'ultimi.

Offline flaviocapaccio

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung I5800 (Galaxy mini)
  • Sistema operativo:
    Windows xp
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #2 il: 13 Dicembre 2011, 23:26:38 CET »
0
Ti ringrazio per la risposta; ho provato a verificare la dimensione del file usando il metodo length() sull'oggetto file istanziato nel server manager ed in fase di invio mi ritrovo la dimensione esatta; quando poi vado sul client, cioè su android, mi risulta un file di 0 byte; la cosa bella è che lo stesso server con un client scritto in java in ambiente desktop mi funziona correttamente!!!

Spero in un vostro aiuto!

Grazie ancora!

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #3 il: 13 Dicembre 2011, 23:54:35 CET »
0
Ti ringrazio per la risposta; ho provato a verificare la dimensione del file usando il metodo length() sull'oggetto file istanziato nel server manager ed in fase di invio mi ritrovo la dimensione esatta; quando poi vado sul client, cioè su android, mi risulta un file di 0 byte; la cosa bella è che lo stesso server con un client scritto in java in ambiente desktop mi funziona correttamente!!!

Spero in un vostro aiuto!

Grazie ancora!
ti funziona perchè il client immagino sia sullo stesso pc... in teoria mandandogli "file" cosi, viene mandata una "referenza debole" al file. come dice ricky, devi mandare i byte
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline flaviocapaccio

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung I5800 (Galaxy mini)
  • Sistema operativo:
    Windows xp
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #4 il: 14 Dicembre 2011, 09:47:15 CET »
0
Ok provo e vi faccio sapere! In realtà con funzioni tipo readByte, writeByte e simili mi funzionava anche su android; ora provo a scrivere i Byte e vedo un pò che succede! Vi terrò aggiornati. Grazie a tutti per l'interessamento!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #5 il: 14 Dicembre 2011, 11:09:55 CET »
0
In realtà con funzioni tipo readByte, writeByte e simili mi funzionava anche su android;

Allora perchè l'hai cambiato!?! :D

Offline flaviocapaccio

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung I5800 (Galaxy mini)
  • Sistema operativo:
    Windows xp
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #6 il: 14 Dicembre 2011, 11:44:12 CET »
0
Scusami non sono stato chiaro... avevo utilizzato readByte e writeByte passando un intero e mi funzionava però per il file volevo utilizzare readObject e writeObject che a quanto pare non funzionano! Alla fine ora sto provando con read e write!

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #7 il: 17 Gennaio 2012, 09:46:20 CET »
0
Per far funzionare correttamente la comunicazione socket Terminale Android - PC, usi per entrambi la stessa connessione Internet, oppure funziona anche sei i due terminali sono connessi a reti differenti?
Morotti Alessio

Offline flaviocapaccio

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung I5800 (Galaxy mini)
  • Sistema operativo:
    Windows xp
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #8 il: 17 Gennaio 2012, 10:24:35 CET »
+1
Spero di aver capito bene la domanda. Uso la stessa connessione per entrambe ed utilizzo indirizzi ip interni in quanto non ho un indirizzo ip pubblico. Per qualsiasi domanda non esitare a contattarmi. Ciao

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #9 il: 17 Gennaio 2012, 12:00:20 CET »
0
La domanda era esattamente quella...Grazie....
A questo punto ti volevo chiedere se è anche possibile comunicare, sempre tra PC-Terminale Android , attraverso comunicazione socket con pc e dispositivo collegati rispettivamente a due reti diverse.
Morotti Alessio

Offline flaviocapaccio

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung I5800 (Galaxy mini)
  • Sistema operativo:
    Windows xp
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #10 il: 17 Gennaio 2012, 13:36:45 CET »
+1
Si che io sappia ci sono tre soluzioni. La prima è a pagamento e consiste nell'avere un indirizzo ip pubblico da utilizzare per il server. I contratti adsl o per internet in generale prevedono l'assegnazione di un indirizzo ip pubblico, però ovviamente il servizio ha un costo e non è di serie.

La seconda soluzione prevede di utilizzare il router per effettuare il NAT dell'indirizzo ip del servizio della propria rete locale in un indirizzo ip pubblico. Io non uso questo servizio perchè non ho accesso alla configurazione del router dal quale mi collego di solito. Trovi le impostazioni al riguardo nella pagina di configurazione del router.

L'altra soluzione è utilizzare siti tipo no-ip.com o simili che permettono di tradurre il tuo indirizzo ip dinamico in un indirizzo ip pubblico. No-ip.com utilizza un client che installato sulla tua macchina si occupa di questa traduzione esponendo il servizio e rendendolo raggiungibile da qualsiasi dispositivo in rete. Io l'ho provato però non mi funzionava bene. Diciamo che questa soluzione va bene nella fase di test dell'applicazione.
Io in fase di test utilizzo gli indirizzi della rete locale.

Se vuoi scrivimi in privato che applicazione stai realizzando.

Spero di esserti stato utile.

Ciao e buon lavoro.

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #11 il: 17 Gennaio 2012, 16:21:06 CET »
0
Ti ringrazio molto per l'interessamento...
Quello che devo realizzare è un'applicazione che consente di connettersi al pc sul quale gira un WebServer(TOMCAT), e questo svolgerà alcuni servizi Java.
Il problema è che per me sembra veramente impossibile accedere al mio pc dall'esterno(in questo caso da un terminale Android)...

Ora sto semplicemente provando la comunicazione Socket ,tra questi due dispositivi appunto , per cercare di trovare delle soluzioni alternative o comunque semplicemente per esercitazione.

Ora provando il tuo codice e altri semplici esempi , incontro sempre il solito scoglio:
 
Codice (Java): [Seleziona]
java.net.SocketException: the operation timed out
in corrispondenza dell' istanziazione della Socket.

I due dispositivi sono connessi entrambi ad una rete pubblica (GUGLIELMO), anche se con due account differenti, in quanto impossibile accedere con due dispositivi mediante lo stesso account.

Utilizzando no-ip , dovrei mettere l'host generato ad esempio (miohost.no-ip.org:8080), al posto dell'indirizzo ip giusto?
Sono disperato.........!!!!!!!!
Morotti Alessio

Offline flaviocapaccio

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung I5800 (Galaxy mini)
  • Sistema operativo:
    Windows xp
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #12 il: 17 Gennaio 2012, 16:56:27 CET »
0
Si no-ip funziona così. Per quanto riguarda la comunicazione con tomcat non dovresti avere problemi perchè tu con tomcat fai girare una servlet e tu dal dispositivo mobile vai ad aprire la stessa ad esempio accedendo ad http://localost:8080/mioservizio/
Prova a verificare se ti funziona prima su un browser di un altro portatile poi se non ti funziona allora il problema è della tua reta; se invece funziona provi ad esercitarti con android. Inizia con un esempio semplice e fammi sapere.
Ciao

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #13 il: 20 Gennaio 2012, 17:03:06 CET »
0
Sembra veramente un caso disperato non riesco a sciogliere questo nodo:
con l'emulatore non ci sono problemi si collega a Tomcat ed anche a pagine Web senza alcun problema, ma quando testandolo sul dispositivo non riesco ad accedere a Tomcat.

Ovviamente, quando lo devo testare sul dispositivo al posto di "localhost", devo mettere "mio_indirizzo_ip:numero_porta_Tomcat", oppure in nome dell'host creato su no-ip; giusto?

Ho integrato Tomcat in Eclipse , ed un'altra cosa emblematica è che se lancio Tomcat normalmente , scrivendo sul browser "http://localhost:8080",non ci sono problemi la pagina di Tomcat funziona correttamente , ma se lo lancio con Eclipse , questo non avviene mi da errore 404,  anche se l'emulatore si collega perfettamente anche in questo caso.

Detto questo non può essere magari un errore di configurazione di Tomcat?
Morotti Alessio

Offline flaviocapaccio

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung I5800 (Galaxy mini)
  • Sistema operativo:
    Windows xp
Re:Server Java - Client Android - Send file da Server a Client con socket
« Risposta #14 il: 23 Gennaio 2012, 10:08:06 CET »
0
Guarda penso di aver avuto lo stesso problema però non mi è molto chiara la descrizione del tuo. Fammi capire meglio. Io mi sono trovato in situazioni simili però non ho capito se è la stessa. Aspetto tua descrizioni più dettagliate. Ciao