IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Client TCP sous android aide pour recevoir les messages


Sujet :

Android

  1. #1
    Membre régulier Avatar de Vestaproman
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2003
    Messages : 95
    Points : 84
    Points
    84
    Par défaut Client TCP sous android aide pour recevoir les messages
    Bonjour

    Je suis en train d'essayer de développer un client TCP Android pour piloter un appli QT. J'ai mis au point un serveur QT. Il doit envoyer des trames TCP mais également en recevoir du client.

    Actuellement j'arrive sur mon terminal Android :
    - à me connecter
    - à envoyer une commande vers mon serveur.

    Par contre j'aimerais recevoir des infos du serveur et là je ne sais pas comment faire.
    J'ai essayé de démarrer un thread de lecture mais cela ne fonctionne pas.

    Je vous joins le code qui fonctionne actuellement.

    Est ce que quelqu'un pourrai me donner une piste de réflexion, ou du code pour mon besoin.

    Merci de votre aide

    VPM

    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     
     
    import java.io.BufferedWriter;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
     
     
     
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
     
    public class TestwifiActivity extends Activity
    {
    	private TextView textview_receivedmessage;
    	private TextView textview_sendmessage;
    	private TextView textview_ipaddress;
    	private TextView textview_portaddress;
    	private Button but_sendmessage;
    	private Button but_okconnexion;
     
    	private String IP_address;
    	private int IP_port;
    	private String MessageToSend;
    	private Thread cThread;
     
    	private boolean connected = false;
     
    	private Socket socket;
     
    	/** Called when the activity is first created. */
    	@Override
    	public void onCreate(Bundle savedInstanceState) 
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		textview_receivedmessage = (TextView)findViewById(R.id.textE_ReceivedMessage);
    		textview_sendmessage = (TextView)findViewById(R.id.textE_SendMessage);
    		textview_ipaddress = (TextView)findViewById(R.id.textE_IpAddress);
    		textview_portaddress = (TextView)findViewById(R.id.textE_PortAddress);
    		but_sendmessage = (Button)findViewById(R.id.btn_Send);
    		but_okconnexion = (Button)findViewById(R.id.btn_OkConnexion);
     
    		textview_ipaddress.setText("192.168.20.25");
    		textview_portaddress.setText(String.valueOf(2600));
    		textview_sendmessage.setText("Hello from Android");
     
     
    		but_okconnexion.setOnClickListener( new View.OnClickListener() {  
    			 @Override
    	     	   public void onClick(View v) { 
     
     
    				 IP_address = textview_ipaddress.getText().toString();
    				 IP_port = Integer.parseInt(textview_portaddress.getText().toString());
    				 connectSocket();
    			 }
    		 });
     
    		but_sendmessage.setOnClickListener( new View.OnClickListener() {  
    	     	   @Override
    	     	   public void onClick(View v) {   
    	     		  try 
    	     			{  
     
    	     				PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
    						MessageToSend = textview_sendmessage.getText().toString();
    						out.println(MessageToSend);
    	     			}
    	     			catch (UnknownHostException e) 
    	     			{
    	     				// TODO Auto-generated catch block
    	     				Log.e("TCP", "C: UnknownHostException", e);
    	     				e.printStackTrace();
    	     			}
    	     			catch (IOException e) 
    	     			{
    	     				// TODO Auto-generated catch block
    	     				Log.e("TCP", "C: IOException", e);
    	     				e.printStackTrace();
    	     			}
    	     	   }
    	     	  });
     
     
    	}
     
     
     
     
    	private void connectSocket()
    	{
    		// TODO Auto-generated method stub
    		try 
    		{
    				InetAddress serverAddr = InetAddress.getByName(IP_address);
    				Log.d("TCP", "C: Connecting...");
    				socket = new Socket(serverAddr, IP_port);
    				String message = "Hello from Client android emulator";
    				try
    				{
    					Log.d("TCP", "C: Sending: '" + message + "'");
    					PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
    					BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     
     
    					out.println(message);
     
    					Log.d("TCP", "C: Sent.");
    					Log.d("TCP", "C: Done.");
     
     
    				}
    				catch(Exception e)
    				{
    					Log.e("TCP", "S: Error", e);
    				}
     
    			}
    		catch (UnknownHostException e) 
    		{
    			// TODO Auto-generated catch block
    			Log.e("TCP", "C: UnknownHostException", e);
    			e.printStackTrace();
    		}
    		catch (IOException e) 
    		{
    			// TODO Auto-generated catch block
    			Log.e("TCP", "C: IOException", e);
    			e.printStackTrace();
    		}
    	}

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Un socket 'STREAM' (dont TCP fait partie) est à double sens...

    On peut écrire dedans, mais aussi lire ....
    Nulle besoin "d'écouter"...

    Par contre, comme toute communication réseau, l'ensemble doit être fait dans un thread à part (AsyncTask ?)
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre régulier Avatar de Vestaproman
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2003
    Messages : 95
    Points : 84
    Points
    84
    Par défaut
    Merci de ta réponse.
    Voila ce que je viens d'essayer dans, j'arrive à voir que des donnée envoyer par mon serveur arrive dans le thread en mode debug par contre je ne vois pas comment mettre ce message dans le TextView textview_textin

    merci

    VPM


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    public class JssclientActivity extends Activity {
    private EditText serverIp;
     
    private Button connectPhones;
     
    private String serverIpAddress = "192.168.0.2";
     
    private boolean connected = false;
     
    private TextView textview_textin;
     
     
     
    public class ClientThread implements Runnable {
     
        public void run() {
            try {
     
                InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
                Log.d("ClientActivity", "C: Connecting...");
                Socket socket = new Socket(serverAddr, 2600);
                connected = true;
                while (connected) {
                    try {
     
                        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        String inMsg = "";
                        char buf[] = null;
                         int val = in.read();
                         while (-1 != val) {
                            inMsg = in.readLine();
                        }
     
                    } catch (Exception e) {
                        Log.e("ClientActivity", "S: Error", e);
                    }
                }
                socket.close();
                Log.d("ClientActivity", "C: Closed.");
            } catch (Exception e) {
                Log.e("ClientActivity", "C: Error", e);
                connected = false;
            }
        }
    }
     
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     
        textview_textin = (TextView) findViewById(R.id.textin);
        connectPhones = (Button) findViewById(R.id.connect);
     
        connectPhones.setOnClickListener( new View.OnClickListener() {  
         @Override
         public void onClick(View v) {
             if (!connected) {
                 //serverIpAddress = serverIp.getText().toString();
                if (!serverIpAddress.equals("")) {
                     Thread cThread = new Thread(new ClientThread());
                     cThread.start();
                    }            
             }
         }
     });
     
    }

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Dans ton code je ne vois pas ou tu essayes de le faire...

    Pour modifier l'UI il faut être dans le thread de l'UI, pour cela il y a 3 méthodes:

    1: Appeler la fonction runOnUIThread() de l'Activity avec un Runnable(). Ton client thread étant une sous classe de l'activité tu peux donc appeler: JssclientActivity.this.runOnUIThread(new Runnable() { .... } );

    2: Utiliser les AsyncTask... Ce sont des classes qui vont executer du code dans un thread à part (doInBackground()) mais aussi, une fois le code fini, d'éxecuter du code dans le thread qui a créé l'AsyncTask (UI) (preExecute() et plus interessant postExecute())....

    3: Utiliser les Handler... C'est ce que font (de manière cachée) les solutions ci-dessus au passage... L'Activity déclare un handler... le thread envoit un message au handler quand il a finit. Le handler tournant dans le thread de l'UI, tout va bien.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Membre régulier Avatar de Vestaproman
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2003
    Messages : 95
    Points : 84
    Points
    84
    Par défaut
    Merci de ta réponse,

    J'ai essayé avec les AsyncTask en m'inspirant du web. J'arrive à envoyer des commandes et à les recevoir sur mon serveurs.
    Par contre j'ai une remarque. En ce moment cela fonctionne royale, pas de perte de paquet, pas de retard. J'ai 2 barrette sur mon réseau wifi
    Mais tout à l'heure je n'avais que une barette et j'ai des message qui n'arrivais pas, des déconnexion. Est ce que la qualité du réseau peut être une source de problème.

    Merci

    VPM

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
     
     
    public class JssclientActivity extends Activity {
        private Button btnStart, btnSend;
        private TextView textmessage;
        private TextView textStatus;
        NetworkTask networktask;
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
             textStatus = (TextView)findViewById(R.id.textStatus);
            textmessage = (TextView)findViewById(R.id.editT_Message);
     
            networktask = new NetworkTask(); //Create initial instance so SendDataToNetwork doesn't throw an error.
            btnSend = (Button)findViewById(R.id.btnSend);
            btnSend.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v){
     
                     textStatus.setText("Sending Message to AsyncTask.");
                    String message = textmessage.getText().toString();
                    networktask.SendDataToNetwork(message);
     
                }
            });
     
            btnStart = (Button)findViewById(R.id.btnStart);
            btnStart.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v){
     
                   btnStart.setVisibility(View.INVISIBLE);
                    networktask = new NetworkTask(); //New instance of NetworkTask
                    networktask.execute();
     
                }
            });
     
        }
     
         public class NetworkTask extends AsyncTask<Void, byte[], Boolean> {
            Socket nsocket; //Network Socket
            InputStream nis; //Network Input Stream
            OutputStream nos; //Network Output Stream
     
            @Override
            protected void onPreExecute() {
                Log.i("AsyncTask", "onPreExecute");
            }
     
            @Override
            protected Boolean doInBackground(Void... params) { //This runs on a different thread
                boolean result = false;
                try {
                    Log.i("AsyncTask", "doInBackground: Creating socket");
                    SocketAddress sockaddr = new InetSocketAddress("192.168.20.21", 2600);
                    nsocket = new Socket();
                    nsocket.connect(sockaddr/*,5000*/); //10 second connection timeout
                    if (nsocket.isConnected()) { 
                        nis = nsocket.getInputStream();
                        nos = nsocket.getOutputStream();
                        Log.i("AsyncTask", "doInBackground: Socket created, streams assigned");
                        Log.i("AsyncTask", "doInBackground: Waiting for inital data...");
                        byte[] buffer = new byte[4096];
                        int read = nis.read(buffer, 0, 4096); //This is blocking
                        while(read != -1){
                            byte[] tempdata = new byte[read];
                            System.arraycopy(buffer, 0, tempdata, 0, read);
                            publishProgress(tempdata);
                            Log.i("AsyncTask", "doInBackground: Got some data");
                            read = nis.read(buffer, 0, 4096); //This is blocking
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.i("AsyncTask", "doInBackground: IOException");
                    result = true;
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.i("AsyncTask", "doInBackground: Exception");
                    result = true;
                } finally {
                    try {
                        nis.close();
                        nos.close();
                        nsocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    Log.i("AsyncTask", "doInBackground: Finished");
                }
                return result;
            }
     
            public void SendDataToNetwork(String cmd) { //You run this from the main thread.
                try {
                    if (nsocket.isConnected()) {
                        Log.i("AsyncTask", "SendDataToNetwork: Writing received message to socket");
                        nos.write(cmd.getBytes());
                    } else {
                        Log.i("AsyncTask", "SendDataToNetwork: Cannot send message. Socket is closed");
                    }
                } catch (Exception e) {
                    Log.i("AsyncTask", "SendDataToNetwork: Message send failed. Caught an exception");
                }
            }
     
            @Override
            protected void onProgressUpdate(byte[]... values) {
                if (values.length > 0) {
                    Log.i("AsyncTask", "onProgressUpdate: " + values[0].length + " bytes received.");
                    textStatus.setText(new String(values[0]));
                }
            }
            @Override
            protected void onCancelled() {
                Log.i("AsyncTask", "Cancelled.");
                btnStart.setVisibility(View.VISIBLE);
            }
            @Override
            protected void onPostExecute(Boolean result) {
                if (result) {
                    Log.i("AsyncTask", "onPostExecute: Completed with an Error.");
                    textStatus.setText("There was a connection error.");
                } else {
                    Log.i("AsyncTask", "onPostExecute: Completed.");
                }
                btnStart.setVisibility(View.VISIBLE);
            }
        }
     
        @Override
        protected void onDestroy() {
            super.onDestroy();
            networktask.cancel(true); //In case the task is currently running
        }
    }

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Delay transmission Android
    Bonjour,
    Excusez-moi je veux retarder les données envoyées par Android (en utilisant le wifi par exemple) en modifiant le code source d'Android. Est ce que c'est possible ?

    Merci.

  7. #7
    Membre régulier Avatar de Vestaproman
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2003
    Messages : 95
    Points : 84
    Points
    84
    Par défaut
    Bonjour

    Je ne comprends pas votre demande

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/05/2011, 20h55
  2. [GNAT+GPS] Aide pour comprendre les messages du compilateur
    Par guerrier-cachalot dans le forum Ada
    Réponses: 6
    Dernier message: 07/04/2009, 18h55
  3. Les sessions en javascript; XML sous FF; Aide pour un projet
    Par FremyCompany dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 15/05/2006, 17h59
  4. Besoin d'aide pour recuperer les fichier d'un projet
    Par barthelv dans le forum Applications et environnements graphiques
    Réponses: 9
    Dernier message: 14/04/2006, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo