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

API standards et tierces Android Discussion :

Socket Android Bloque Activity


Sujet :

API standards et tierces Android

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Socket Android Bloque Activity
    Bonsoir,

    Je sollicite votre aide car depuis quelque jours je suis bloquer dans le devellopement de mon Application

    Je voudrai crée de mes propre main (Pour apprendre) une application type airdroid pour cela j'ai besoin d'une connexion socket

    La connexion fonctionne car j'ai reussi a envoyer des message a partir d'une page web cependant dès que la méthode socket ("start()") est lancée a l'aide d'un bouton l'activity ce bloque le bouton reste en mode "appuyer".

    Alors j'ai voulu utilisée un service pour faire tourner le server en arriere plan mes dès que le service est lancée pareil sa bloque tout.

    SERVER
    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
     public class server implements Runnable {
     
    	public static void start() throws IOException {
    		boolean run = true;
    	    ServerSocket serverSocket = new ServerSocket(7000);
     
     
     
    	        Socket connectionSocket = null;
    	        InputStream input = null;
    	        OutputStream output = null;
     
    	        while(run){
    	        try {
    	            connectionSocket = serverSocket.accept();
    	            input =   connectionSocket.getInputStream();
    	            output = connectionSocket.getOutputStream();
     
    	            // At this point do whatever you need to do with these streams
    	        } catch(Exception e) {
     
     
    	        } finally {
     
    	            if(input != null) {
     
    	            	BufferedReader in = 
    	                         new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));  }
     
    	            if(output != null) {
    	                output.close();
    	           }
    	}
     
    }}}
    Service
    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
     
    public void onStart(Intent intent, int startId) {
         super.onStart(intent, startId);
     
     
         try {
    		server.start();
    		 Toast toast = Toast.makeText(getApplicationContext(), "Server OK", Toast.LENGTH_SHORT);
    	     toast.show();
    	} catch (IOException e) {
    		 Toast toast = Toast.makeText(getApplicationContext(), "Erreur Server", Toast.LENGTH_SHORT);
    	     toast.show();
    	}
     
         this.stopSelf();
     }
    Appel Service Dans MainActivity
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Intent service = new Intent(this, MonService.class);
    	this.startService(service);
    Bien sur j'ai essayer dans le code du server de mettre dans if(input != null) run = false; et la la boucle s'arrete et le bouton se déclenche a la reception de donnée mais je voudrai que le service tourne en continu pendant que l'application est ouverte ! et sans que l'affichage plante en attendant la fin de la boucle.

    Bref j'espere avoir fournie assez de renseignement
    Merci d'avance pour vos réponse

  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
    Le serveur doit tourner dans un thread...
    Tout comme d'ailleurs le "handling" des connexions.

    L'activité doit donc démarrer le server, et l'arrêter... un truc genre:


    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
     
    class Server extends Thread
    {
        private boolean ended = false;
     
        public void start() throws IOException
        {
           ... on prépare tout...
           super.start(); // on démarre le "vrai" thread
        }
     
        public void stop() {
            this.ended = true;
            interrupt();
        }
     
        public void run() {
            // on crée le socket server
            while (!this.ended) {
                // quand on a un worker... on attend un socket
                Socket s = this.serverSocket.accept(); // bloquant d'ou le "interrupt" lors du "stop"
                // on utilise le socket
                s.close();
             }
             // on ferme le socket server
         }
    }
    start() n'est donc pas bloquant.

    Par contre la boucle "run()" a un problème... comment en effet accepter plusieurs connexions en même temps ?
    Il faut donc que l'utilisation du socket soit elle-même dans un thread.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. Partager une socket en plusieurs activity
    Par k4st0r42 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 01/05/2018, 21h45
  2. Communication Sockets Android-C++
    Par aldagon72 dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 13/03/2012, 11h31
  3. [C++][SOCKET]recv() bloque la première fois
    Par xwindoo dans le forum Développement
    Réponses: 15
    Dernier message: 18/08/2006, 20h57
  4. Réponses: 20
    Dernier message: 10/07/2006, 16h53
  5. Réponses: 6
    Dernier message: 13/04/2006, 15h54

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