Autore Topic: problema connessione con socket tra server ed htc  (Letto 1533 volte)

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
problema connessione con socket tra server ed htc
« il: 16 Novembre 2010, 18:41:05 CET »
0
salve ragazzi.
Sto tendando di far comunicare un server...il mio pc...127.0.0.1 con il cellulare android e sto tentando di passargli alcuni file (2) spediti dal server....
se uso l'sdk e gli passo l'ip del pc con cui mi connetto al wi-fi e il numero di porta (scelto a caso 4444) va tutto ok...
se invece uso l'htc e setto come client l'idirizzo ip dell'htc cioè 192.168.0.100 non funziona nulla e nel logcat ho il seguente errore:
11-16 18:32:51.157: ERROR/TCP(4997): java.net.ConnectException: /192.168.0.100:4444 - Connection refused

il client nei vari file java con cui mi costruisco i thread di comunicazione con il server lo dichiaro nel seguente modo:
Codice (Java): [Seleziona]
InetAddress serverAddr = InetAddress.getByName("192.168.0.100");//TCPServer.SERVERIP
                 
                 Log.d("TCP", "C: Connecting to server...");
                 //Socket socket = new Socket(serverAddr, TCPDesktopServer.SERVERPORT);
                 Socket socket = new Socket(serverAddr, 4444);

non so dove sbaglio e non so se possa essere un problema di firewall o di windows dato che uso windows vista...
vi ringrazio...tra poco posto meglio l'errore che ho nel logcat...

errore logcat:
11-16 18:43:53.768: ERROR/TCP(5219): C: Error
11-16 18:43:53.768: ERROR/TCP(5219): java.net.ConnectException: /192.168.0.100:4444 - Connection refused
11-16 18:43:53.768: ERROR/TCP(5219):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:254)
11-16 18:43:53.768: ERROR/TCP(5219):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:219)
11-16 18:43:53.768: ERROR/TCP(5219):     at java.net.Socket.startupSocket(Socket.java:781)
11-16 18:43:53.768: ERROR/TCP(5219):     at java.net.Socket.<init>(Socket.java:316)
11-16 18:43:53.768: ERROR/TCP(5219):     at ch.egsolutions.databasetutorial.TCPClientArticoli.run(TCPClientArticoli.java:26)
11-16 18:43:53.768: ERROR/TCP(5219):     at java.lang.Thread.run(Thread.java:1102)
11-16 18:43:53.778: ERROR/DomParsing(5219): java.io.FileNotFoundException: /mnt/sdcard/articoli.xml (No such file or directory)
11-16 18:43:53.778: ERROR/DomParsing(5219): java.io.FileNotFoundException: /mnt/sdcard/logspesa.xml (No such file or directory)
11-16 18:43:53.778: DEBUG/TCP(5219): C: Connecting to server...
11-16 18:43:53.778: ERROR/TCP(5219): C: Error
11-16 18:43:53.778: ERROR/TCP(5219): java.net.ConnectException: /192.168.0.100:4444 - Connection refused
11-16 18:43:53.778: ERROR/TCP(5219):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:254)
11-16 18:43:53.778: ERROR/TCP(5219):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:219)
11-16 18:43:53.778: ERROR/TCP(5219):     at java.net.Socket.startupSocket(Socket.java:781)
11-16 18:43:53.778: ERROR/TCP(5219):     at java.net.Socket.<init>(Socket.java:316)
11-16 18:43:53.778: ERROR/TCP(5219):     at ch.egsolutions.databasetutorial.TCPClientLogSpesa.run(TCPClientLogSpesa.java:25)
11-16 18:43:53.778: ERROR/TCP(5219):     at java.lang.Thread.run(Thread.java:1102)
11-16 18:43:53.828: WARN/ResourceType(254): getEntry failing because entryIndex 136 is beyond type entryCount 102
11-16 18:43:53.828: WARN/ResourceType(254): Failure getting entry for 0x7f020088 (t=1 e=136) in package 0: 0x80000001
« Ultima modifica: 16 Novembre 2010, 18:45:13 CET da Albe85 »

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:problema connessione con socket tra server ed htc
« Risposta #1 il: 17 Novembre 2010, 18:13:32 CET »
0
che idiots che sono...il 127.0.0.1 non serve a nulla...basta mettere come server nei vari file java di thread di richiesta al server l'indirizzo della macchina sulla quale si fa girare il server...

Codice (Java): [Seleziona]
                 InetAddress serverAddr = InetAddress.getByName("IP DEL SERVER");//TCPServer.SERVERIP
               
                 Socket socket = new Socket(serverAddr, 4444);

Offline Alby

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Desire
Re:problema connessione con socket tra server ed htc
« Risposta #2 il: 23 Novembre 2010, 13:54:17 CET »
0
Ciao, volevo chiederti se sei riuscito ad implementare un ServerSocket che vada tra pc(emulatore) e telefono o già da telefono telefono.

Io ho seguito molti tutorial ma non ne ho trovato ancora 1 che funzioni :(

Se hai trovato il modo corretto di fare funzionare il tutto potresti postare un po di codice e vedere dove sono le differenze tra il mio ed il tuo.

Io su telefono ad esempio non vedo niente nella log della mia app...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:problema connessione con socket tra server ed htc
« Risposta #3 il: 23 Novembre 2010, 14:02:31 CET »
0
Ciao, volevo chiederti se sei riuscito ad implementare un ServerSocket che vada tra pc(emulatore) e telefono o già da telefono telefono.
Io ho seguito molti tutorial ma non ne ho trovato ancora 1 che funzioni :(

Tra emulatore e telefono sarà seccante riuscire a far vedere i dispositivi per via degli indirizzamenti che usa.
Io ti consiglio di provare tra telefono e telefono. Sei sicuro che gli Ip siano giusti?
Prova a creare un progettino "giocattolo" con un semplice server e un semplice client, fai qualche prova ed eventualmente apri un nuovo thread.

Offline Alby

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Desire
Re:problema connessione con socket tra server ed htc
« Risposta #4 il: 23 Novembre 2010, 14:28:54 CET »
0
Ok, provo ancora un pò che sono 4 giorni che ci sbatto la testa senza alcun segno positivo! :(

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:problema connessione con socket tra server ed htc
« Risposta #5 il: 26 Novembre 2010, 15:53:10 CET »
0
Ciao Alby..scusa se ti rispondo in ritardo ma sono giorni che sono stra impegnato...ora cerco di risponderti...

Per quanto il funzionamento generale mi sono creato un server che sta sempre in ascolto su una porta (io ho scelto la porta 4444 ma puoi mettere un numero a piacere, l'importante è che sia la stessa porta su cui starà in ascolto il client cioè il tuo smartphone).
Per quanto riguarda la comunicazione io mi sono creato una sorta di protocollino di comunicazione nel quale il client (il cell) invia al server che è sempre in ascolto alcune richieste sotto forma di stringa del tipo (INVIAMI IL FILE ESEMPIO.XML) oppure (TI INVIO IL FILE ESEMPIO.XML).
Il server riceve queste stringhe le interpreta ed esegue l'azione corrispondente.

Questo è il file del server che devi far girare in un progetto java esterno al tuo progetto android di eclipse.

Codice (Java): [Seleziona]
public class TCPDesktopServer implements Runnable{
       
    public static final int SERVERPORT = 4444;
   
    public void run() {
         try {
                 System.out.println("SERVER: Connecting...");
             
             ServerSocket serverSocket = new ServerSocket(SERVERPORT);
             while (true) {
                 
                    int filesize=6022386; // filesize temporary hardcoded

                    long start = System.currentTimeMillis();
                    int bytesRead;
                    int current = 0;

                 
                  Socket client = serverSocket.accept();
                  System.out.println("S: Receiving to client...");
         
                  try {
                     
                          BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                      String str = in.readLine();
                      //System.out.println(str);
                     
                   
                      //Il server invia al client il file articoli.xml
                     if("INVIAMI IL FILE ARTICOLI.XML".equals(str)){
                      System.out.println("S: CLIENT DICE: '" + str + "'");
                        // Server che invia il file articoli.xml
                        DataOutputStream outArt = new DataOutputStream(client.getOutputStream());
                                FileInputStream inArt = new FileInputStream("articoli.xml");
                                byte bufferArt[] = new byte[1024];
                                System.out.println( "Invio file in corso articoli.xml..." );
                                int iArt;
                                while((iArt = inArt.read(bufferArt,0,bufferArt.length)) != -1){
                                outArt.write(bufferArt,0,iArt);
                                outArt.flush();
                                }
                                inArt.close();
                                System.out.println( "Invio completato." );                    
                     }

//Il client riceve dal server un file e se lo salva nella cartella del progetto in cui gira il file java del server
 if("TI INVIO LE QUANTITA COMPERATE".equals(str)){
                         System.out.println("S: CLIENT DICE: '" + str + "'");
                           //RICEZIONE NELLA CARTELLA DI LAVORO DEL FILE QUANTITATOSERVER.xml DAL
                           //DISPOSITIVO MOBILE
                           byte [] mybytearray  = new byte [filesize];
                           InputStream is = client.getInputStream();
                           FileOutputStream fos = new FileOutputStream("QUANTITATOSERVER.xml");
                           BufferedOutputStream bos = new BufferedOutputStream(fos);
                           bytesRead = is.read(mybytearray,0,mybytearray.length);
                           current = bytesRead;

                           do {
                              bytesRead = is.read(mybytearray, current, (mybytearray.length-current));
                              if(bytesRead >= 0) current += bytesRead;
                           } while(bytesRead > -1);

                           bos.write(mybytearray, 0 , current);
                           bos.flush();
                           long end = System.currentTimeMillis();
                           System.out.println("S: SERVER DICE: QUANTITATOSERVER.XML RICEVUTO");
                           System.out.println("TEMPO IMPIEGATO RICEZIONE DA PARTE DEL SERVER DEL FILE QUANTITATOSERVER.XML: "+(end-start));
                           bos.close();
                          }

} catch(Exception e) {
                        System.out.println("S: Error");
                        e.printStackTrace();
                    } finally {
                        client.close();
                        System.out.println("S: Done.");
                    }

             }
             
         } catch (Exception e) {
             System.out.println("S: Error");
             e.printStackTrace();
         }

Il main di questo file l'ho creato sotto la classe TCPDesktopServer che ho creato (quella sopra) ma questo main volendo lo puoi creare anche in un altro file
Codice (Java): [Seleziona]
//MAIN
    public static void main (String a[]) throws SQLException, ClassNotFoundException {
       
        try{
                       
                invioFileXMLtoAndroid();
               
                }catch(IOException ex){
                        ex.printStackTrace();
                }
       
        Thread desktopServerThread = new Thread(new TCPDesktopServer());
        desktopServerThread.start();
       
       
               
       
    } //Fine MAIN
   
   
   
static public void invioFileXMLtoAndroid() throws IOException, SQLException, ClassNotFoundException{
               
                XmlWriter xmlwriterArt  = new XmlWriter(new     java.io.FileWriter("articoli.xml"));
            XmlWriter xmlwriterLog      = new XmlWriter(new     java.io.FileWriter("logspesa.xml"));
               
                Vector<ArticoloBean> VetArt = ArticoloDB.getAllArticolo(DBConnection.getBDConnection().getConnection());
                Vector<LogSpesaBean> VetLog = LogSpesaDB.getLogSpesa(DBConnection.getBDConnection().getConnection(),CalendarUtility.getTodayLong());           
               

                for(int j=0; j<VetArt.size(); j++)
                        {
                                xmlwriterArt.writeObject(VetArt.elementAt(j));
                        }
                xmlwriterArt.close();
               
               
               
                for(int j=0; j<VetLog.size(); j++)
                        {
                                xmlwriterLog.writeObject(VetLog.elementAt(j));
                        }
                xmlwriterLog.close();
}
 
Dove nel main chiamo il metodo invioFileXMLtoAndroid()  dove creo due file serializzati in xml tramite query ad un db postgreSql, che saranno poi i file che invio al cell quando mi fa la richiesta.

Veniamo ora alla parte client, cioè alla parte android.
Praticamente mi sono creato all'interno del progetto android dei file java con ognuno un thread di comunicazione del server che poi andrò a lanciare nell'activity principale.
Ad esempio:
Codice (Java): [Seleziona]
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import android.os.Environment;
import android.util.Log;

public class TCPClientArticoli implements Runnable {

       
    public void run() {
         try {
                 //rlabgw0.unipv.it:888
                 InetAddress serverAddr = InetAddress.getByName("IP DEL TUO SERVER");//TCPServer.SERVERIP
                 
                 Log.d("TCP", "C: Connecting to server...");
                 //Socket socket = new Socket(serverAddr, TCPDesktopServer.SERVERPORT);
                 Socket socket = new Socket(serverAddr, 4444);
                 
                 
                 String message = "INVIAMI IL FILE ARTICOLI.XML";
                 
                 
                     try {
                         
                         Log.d("TCP", "CLIENT: Sending: '" + message + "'");
                         PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
                         out.println(message);
                       
                     
                     System.out.println("Ricezione file in corso articoli.xml..");
                     DataInputStream inArt = new DataInputStream(socket.getInputStream());
                     File sdcardDirArt = Environment.getExternalStorageDirectory();
                         File myFileArt = new File(sdcardDirArt,"articoli.xml");
                     FileOutputStream outArt = new FileOutputStream(myFileArt);
                     byte bufferArt[] = new byte[1024];
                     int iArt;
                     while ((iArt = inArt.read(bufferArt,0,bufferArt.length)) != -1){
                     System.out.println("ci sono");
                     outArt.write(bufferArt,0,iArt);
                     }
                     outArt.flush();
                     outArt.close();
                     System.out.println( "Ricezione completata!" );

                     Log.d("TCP", "C: Sent.");
                     Log.d("TCP", "C: Done. DATI INVIATI!");
                     
                     
                     
                     
             } catch(Exception e) {
                 Log.e("TCP", "S: Error", e);
                      } finally {
                        socket.close();
                     
                      }
         } catch (Exception e) {
              Log.e("TCP", "C: Error", e);
         }
         
         
    }//chiusura metodo run

}//chiusura public class TCPClient implements Runnable

In questo caso il client richiede al server di inviargli il file articoli.xml e poi si preparà a riceverlo e lo riceve memorizzandolo sulla sd.
L'indirizzo ip al quale il client invierà la richiesta ovviamente è quello del server, cioè l'ip della tua macchina.
Ora nell'activity principale di android dove ti serve per mandare effettivamente la richiesta al client farai:
Codice (Java): [Seleziona]
Thread cThread = new Thread(new TCPClientArticoli());
                        cThread.start();
In questo modo funziona benissimo tutto sia tra pc(server) e sdk(client) sia tra pc(server)  e smartphone(client) sempre che tu sia connesso alla rete da entrambi i lati. Nel mio caso ho in casa un router wi-fi.
Spero di essere stato esaudiente nella risposta.
Ciao!
« Ultima modifica: 26 Novembre 2010, 15:56:00 CET da Albe85 »

Offline Alby

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Desire
Re:problema connessione con socket tra server ed htc
« Risposta #6 il: 26 Novembre 2010, 16:15:12 CET »
0
Ciao si sei stato veramente gentilissimo!! anche io adesso ce l'ho fatta dopo un paio di giorni di fuoco!! :)
Sono giunto ad una soluzione molto simile alla tua (il che mi fa ben sperare)
Adesso mi sto focalizzando su un discover udp (se hai consigli ben vengano), perché voglio che il server sia sul telefono (a progetto terminato) non sul pc e quindi devo avere un metodo per sapere gli ip di chi vuole connettersi e spero sia più liscio da fare (ma non credo).

Detto ciò ti ringrazio ancora :)

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:problema connessione con socket tra server ed htc
« Risposta #7 il: 26 Novembre 2010, 16:45:06 CET »
0
Per ora con il protocollo udp non ho ancora visto nulla...cmq interessante la soluzione di usare come server il telefono...figurati per l'aiuto fino a che posso aiutare qualcuno non c'è problema...ben venga!!  :-) :-)

Offline Alby

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Desire
Re:problema connessione con socket tra server ed htc
« Risposta #8 il: 26 Novembre 2010, 17:53:40 CET »
0
E' una idea per un app per condividere alcuni oggetti di utilità e allora devo instaurare un serverino sotto :) tu scriveresti un service che gira in background oppure faresti partire una thread dalla activity quando serve??

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:problema connessione con socket tra server ed htc
« Risposta #9 il: 27 Novembre 2010, 10:31:34 CET »
0
io per il server farei un servizio che gira in background almeno è sempre attivo e riesce comodamente a gestire le richieste dei vari client. Altrimenti dovresti continuamente aprire e chiudere thread.

Offline Alby

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Desire
Re:problema connessione con socket tra server ed htc
« Risposta #10 il: 27 Novembre 2010, 11:35:56 CET »
0
E' quello che avevo pensato infatti :)

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:problema connessione con socket tra server ed htc
« Risposta #11 il: 11 Gennaio 2012, 11:05:25 CET »
0
Domanda Banale,ma per la connessione socket tra un pc ed un dispositivo Android, occorre che entrambe i terminali siano collegati alla stessa rete oppure è sufficiente , che siano collegati ad internet e conta nulla se a reti internet differenti?
Morotti Alessio