Autore Topic: Server TCP su Android  (Letto 870 volte)

Offline xdoppiadx

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Fit
  • Sistema operativo:
    Windows 7
Server TCP su Android
« il: 26 Agosto 2012, 11:03:49 CEST »
0
Salve a tutti,

sto' cercando di fare il porting android di un'applicazione client/server.

Se faccio girare tutto su pc funziona tutto correttamente.
Se faccio girare il server su pc e il client su android, il client riesce a collegarsi al server remoto.

Il problema è dunque il lato server.
l'activity contenente il server si blocca su socket.accept(), mentre il client non riesce ad instaurare la connessione (Can't connect to /87.16.101.93
java.net.ConnectException: Connection timed out: connect).

Volevo sapere:
1. Se è possibile realizzare un'applicazione client/server interamente su android (in pratica un dispositivo dovrebbe fare da server, ed uno da client, supponendo che questo ne conosca l'ip).
2. Se c'è qualche errore nel mio codice:


Codice (Java): [Seleziona]
package tcpcommserver.pack;



import java.io.BufferedReader;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
import java.util.Random;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.content.Intent;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import android.media.MediaPlayer;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;

import android.os.*;
import android.Manifest.permission;

public class ServerActivity extends Activity{

        public static int porta;
        public static int controllo=0;
    TextView tv,tv2;
    ServerPippoMTH s;
    String ips;
   
    private WifiManager wifi;
    private WifiInfo info;
   
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.server);
        Intent intent1=getIntent();
       
        porta = intent1.getIntExtra("porta", 222);
 

        tv = (TextView) findViewById (R.id.tvserv1);  
        tv.setText("ciao dal server "+porta);
       
        tv2 = (TextView) findViewById (R.id.tvserv2);  
       
       

        wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
        wifi.setWifiEnabled(true);

        info = wifi.getConnectionInfo();
       
        //if (info.getSSID() != null) { // verifico che la connessione si attiva, in particolare il metodo getBSSID() restituisce valore nullo se la connessione non è attiva
            //this.ipv = (TextView)this.findViewById(R.id.addres);
             //this.text = (TextView)this.findViewById(R.id.text);
             //tv.setText("Terminale connesso a " + info.getSSID()+ " con IP: "); //qui viene richiamato il metodo getSSID() che restituisce una stringa, in particolare l'identificativo dell'SSID
             //int ip = info.getIpAddress(); // il metodo getIpAddress() restituisce un intero che rappresenta l'indirizzo IP, ovviamente non è la tipica rappresentazione a cui siamo abituati ex.: 127.0.0.1
             //String ips = ((( ip & 0xFF )) + "." + (( ip >> 8 ) & 0xFF ) + "." + (( ip >> 16 ) & 0xFF ) + "." + (( ip >> 24 ) & 0xFF ));// converto l'intero nella tipica notazione, ho adottato questo sistema un po grezzo poiche non conosco un altro metodo piu semplice
 
                 ips ="pippo";
                 tv.setText(ips);
                 new Connection().execute();
                         
                 try {
                                s = new ServerPippoMTH (2055);
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }              
                         tv2.setText("Server Istanziato");
        // }
        // else {// se la connessione non è attiva
          //   tv.setText("Nessuna connessione Wifi attiva!");
        // }
       

               
               
               
                 
    }
 
   public class Connection extends AsyncTask <Void, Void, String> {
 
        @Override

        protected String doInBackground(Void...args) {
            String gigi = new String ();
                gigi = connect();              
                return gigi;
           
        }            
       
        protected void onPostExecute(String result) {

                         tv2.setText("Istanzio il server");                      


               
                Log.i("AsyncTask - risultato di connect: ",""+result);
                tv.setText(result);
    }
 
    private String connect() {
         String valore = "cigi";
        try {
                  HttpClient httpclient = new DefaultHttpClient();
                  HttpGet httpget = new HttpGet("http://automation.whatismyip.com/n09230945.asp");
                  HttpResponse response = httpclient.execute(httpget);
                  HttpEntity entity = response.getEntity();
                  if (entity != null) {
                    InputStream instream = entity.getContent();
                    try {
                        // do something useful

                        valore = convertStreamToString(instream);
                        Log.i("valore",""+valore);
                        return valore;
                    } finally {
                        instream.close();
                    }
                }
           
           
        } catch (ClientProtocolException e) {
            Log.d("HTTPCLIENT", e.getLocalizedMessage());
        } catch (IOException e) {
            Log.d("HTTPCLIENT", e.getLocalizedMessage());
        }
                return valore;
    }
   
    public String convertStreamToString(InputStream is)
            throws IOException {
        //
        // To convert the InputStream to String we use the
        // Reader.read(char[] buffer) method. We iterate until the
        // Reader return -1 which means there's no more data to
        // read. We use the StringWriter class to produce the string.
        //
        if (is != null) {
            Writer writer = new StringWriter();
 
            char[] buffer = new char[1024];
            try {
                Reader reader = new BufferedReader(
                        new InputStreamReader(is, "UTF-8"));
                int n;
                while ((n = reader.read(buffer)) != -1) {
                    writer.write(buffer, 0, n);
                }
            } finally {
                is.close();
            }
            return writer.toString();
        } else {      
            return "";
        }
    }
}








class ServerPippoMTH extends Thread {
    private ServerSocket Server;
    private int nsens=0;
    private int porta;          
       
   /**
    * Metodo Costruttore
    * @param port porta TCP sulla quale il server si mette in ascolto
    * @throws IOException
    */

   
    public ServerPippoMTH(int port) throws IOException {

        porta=port;                        
        Server = new ServerSocket(port);                    
        System.out.println("Server in attesa sulla port "+port);
       
        InetAddress indirizzo = Server.getInetAddress();
        String indirizzo_leggibile = indirizzo.getHostAddress();
        System.out.println("++++++++++++++++++++ ++++++++++++++"+indirizzo_leggibile+"_"+indirizzo);
       
        this.start();
    }
         
    public void run() {
        while(true) {
            try {
                System.out.println("In attesa di connessione...");
                System.out.println("id server: "+this.getId());                                
                Socket client = Server.accept();
                System.out.println("Connessione accettata da :"+client.getInetAddress());
                         
                if (porta==2055)
                {
                    ConnectClient c = new ConnectClient(client);
                }                                                            
            }
            catch(Exception e) {
            }
        }      
    }
}


class ConnectClient extends Thread {
    private Socket client;
               
    ObjectInputStream in;
    ObjectOutputStream out;
               
    int scelta;
                                       

    String s = new String();                                    
    /**
     * Costruttore
     */

    public ConnectClient() {
   
    }
   
    /**
     * Costruttore
     * @param clientSocket
     */

    public ConnectClient(Socket clientSocket) {
        System.out.println("Nuovo Client Connesso ID: "+this.getId());
                                 
        client = clientSocket;
                         
        try {                          
            InputStream input = client.getInputStream();
            in = new ObjectInputStream(input);
                                       
            OutputStream output = client.getOutputStream();
            out = new ObjectOutputStream(output);
        } catch(Exception e1) {                        
                try {
                    client.close();
                } catch(Exception e) {
                        System.out.println(e.getMessage());
                  }
                return;
          }
        this.start();
    }          
   
    public void run() {
                       
        try {

            int i=0;
            int id=0;
            while(true) {                                                    
                          s=(String)in.readObject();
                          System.out.println("ricevo: "+s);
            }                                                  
        } catch (Exception e){
               System.out.println(""+e);
            }
    }
}}

Grazie a tutto coloro che volessero cimentarsi nell'aiutarmi :)[/size][/font]