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 :

Communication UDP Java server et C client


Sujet :

API standards et tierces Android

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut Communication UDP Java server et C client
    Bonjour,

    J'ai fait deux codes un serveur coté Android Java et l'autre client en C, j'aimerai réaliser une communication entre les deux mais je ne sais pas comment faire, je cherche sur le net mais je ne trouve pas vraiment ce qui m'intéresse.

    Voilà mon code en Java :

    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
     
    package com.example.server_android;
     
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.Menu;
    import android.widget.TextView;
    import android.widget.Toast;
     
     
    public class Server_Android extends Activity{
     
    	private final static int SERVER_PORT = 1234;
        //private final static int CLIENT_PORT = 10001;
        private  final static String SERVERIP = "127.0.0.1"; 
     
        InetAddress clientAddr = null;
        DatagramSocket socket = null;
        DatagramPacket packetOut = null;
        DatagramPacket packetIn = null;
        byte[] DataIn;
        byte[] DataOut;
        TextView text;
        Toast toast;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
     
    		setContentView(R.layout.activity_server_android);
    		//text = (EditText)findViewById(R.id.editText1);
    		text =(TextView)findViewById(R.id.textView2);
    		text.setText("");
    		DataIn = new byte[1024];
    		DataOut = new byte[1024];
     
    		/* Thread for receiving Data from CLient */
    		new Thread(new Receiver()).start();
    		try {
    			Thread.sleep(500);
    		}catch(InterruptedException e){
    			Log.e("UDP", "UDP receive failed!");
    		}
    	}
     
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.server__android, menu);
    		return true;
    	}
     
     
    	public class Receiver implements Runnable{
     
    		public void run(){
     
    			try {
    			while(true){
     
    					socket = new DatagramSocket(SERVER_PORT);
     
    			text.setText(SERVERIP + "\n");
    			InetAddress clientAdress = InetAddress.getByName(SERVERIP);		
    			text.append("Adresse Client:" + clientAdress + "\n");
    			packetIn = new DatagramPacket(DataOut,DataOut.length);
    			Log.d("UDP", "preparing packet");
    			Log.d("DatagramPacket", "" + packetIn);	
    			text.append("Packet :" + packetIn + "\n");
    			socket.receive(packetIn);
    			Log.d("UDP", "Packet receveid");	
    			String message = new String(packetIn.getData());
    			Log.d("UDP", "le message reçu");
    			Log.d("Message : ", "***" + message);
    			text.append("Message : " + message + "\n");
    			}
    			}catch(Exception e){
    				Log.e("UDP", "Receiver error", e);
    //				toast.makeText(this, "Receviere Error", toast.LENGTH_LONG);
    //	            toast.setGravity(Gravity.CENTER, 0, 0);
    //	            toast.show();
    			}
    			}
    		}
     
     
     
    }
    et le code en C:

    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
     
    //----------------------------------------------------------------------------
    #include "biblio.h"
     
    int
    main(int argc,
         char **argv)
    {
    //_________Seting_Destination_IP_adress____________________
     
    in_addr_t ipAddress= inet_addr("127.0.0.1");
     
    //_________Seting_Destination_port____________________
    int portNumber = 1234;
    //---- create UDP socket ----
    int udpSocket=socket(PF_INET,SOCK_DGRAM,0);
    if(udpSocket==-1)
      { perror("socket"); exit(1); }
     
    struct sockaddr_in toAddr,serverAddr;
    int lenght = sizeof(toAddr);
    int size = sizeof(serverAddr);
     
    // ... allowing broadcast (optional)
    int on=1;
        if(setsockopt(udpSocket,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int))==-1)
        { perror("setsockopt"); exit(1); }
     
    int s;
    for(;;)
      {
      //---- read next line on standard input ----   
      char msg[0x100];
      char *buffer = malloc(100);	
      if(!fgets(msg,0x100,stdin)) { break; } 
      //---- send message to the specified destination/port ----
      bzero(&toAddr,lenght);	
      toAddr.sin_family=AF_INET;
      toAddr.sin_port=htons(portNumber);
      toAddr.sin_addr.s_addr=ipAddress;
      s = sendto(udpSocket,msg,strlen(msg),0,(struct sockaddr *)&toAddr,lenght);
      if( s == -1)  
      { perror("sendto"); exit(1); } 
    }
     
    //---- close UDP socket ----
    close(udpSocket);
    return 0;
    }
    De l'aide svp.
    Merci

  2. #2
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut
    Bonjour,

    Dans ton client en C tu lui passes l'adresse 127.0.0.1, mais ton serveur et ton client tournent sur le même appareil (ca à pas l'air vu que tu charges des librairies Android et que ton prog en C doit sûrement tourner sur PC) ?

    Si non, récupère l'ip de ton serveur, et à la ligne 11 de ton client :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    in_addr_t ipAddress= inet_addr("127.0.0.1");

    Remplace 127.0.0.1 par l'IP de ton serveur.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Oui pour l'instant les deux tournent sur le meme appareil, et pour l'adresse IP du serveur j'ai remplacé 127.0.0.1 par 10.4.0.10 qui est l'adresse de la machine connecté au réseau via l'interface em1 sous Fedora mais ça ne marche toutjours pas!!

    J'ai essayé de me connecter au serveur via netcat à l'aide la commande :
    nc -u 10.4.0.10 1234 mais je ne reçoie rien, il ne se passe rien au niveau du receive de mon programme Java !

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    @nabil.brarou : Si le serveur ne marche pas, ce n'est pas la peine de tester le programme client en C. Je déplace la discussion dans le forum Java pour que des connaisseurs de ce langage puissent t'aider.

    @Javaïens : à vous de jouer ! Renvoyez le sujet quand ce sera le tour du C ^^

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Oui merci, c'est vraiment au niveau de mon programme Java Android que ça bloque, parce que j'ai essayé de créer un serveur C pour communiquer avec mon client et ça marchait bien, maintenant le but et de le faire communiquer avec le serveur Android.
    Quelle sont les changements que je dois effectuer pour que ça marche ? svp

  6. #6
    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
    ben aucun... sauf que 127.0.0.1 cela ne peut pas fonctionner.... quelque soit le cas...

    Tu as essayé de faire un serveur C et il fonctionne avec 127.0.0.1 ? Mais dans ce cas c'est obligatoirement sur la même machine virtuelle... hors ce n'est pas possible sous android.

    De toute manière le sujet n'a pas grand chose à voir avec Android.... Si on spécifie une @ IP à un socket UDP, on dit spécifique sur quelle interface on écoute, et 127.0.0.1 veut dire: "je ne veux écouter que les paquets UDP qui arrivent sur la boucle locale" (donc depuis la machine locale).
    C'est INADDR_ANY (0) qu'il faut utiliser pour le "bind" pour dire: "sur n'importe quellle interface".
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Dsl pour le retard!

    J'ai fait un serveur en C et il fonctionne parfaitement avec le cilent C en 127.0.0.1,
    tu m'as parlé du INADDR_ANY (0) pour le bind, celle là est à utiliser au niveau du serveur C je pense et moi j'ai un client C que je dois le faire communiquer avec mon serveur Java !

  8. #8
    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
    Citation Envoyé par nabil.brarou Voir le message
    J'ai fait un serveur en C et il fonctionne parfaitement avec le cilent C en 127.0.0.1,
    Le serveur il fait le bind comment ? Si il le fait avec 127.0.0.1, il ne marchera *QUE* avec des clients sur la machine locale qui appellent 127.0.0.1.

    tu m'as parlé du INADDR_ANY (0) pour le bind, celle là est à utiliser au niveau du serveur C je pense et moi j'ai un client C que je dois le faire communiquer avec mon serveur Java !
    Je ne parle pas de langage là... que ce soit java, C, C#, Perl, javascript, ou basic, le problème est le même....

    Il y a un socket (pour datagram il n'y a d'ailleurs ni client ni serveur hein !)... Ce socket écoute/utilise une ou plusieurs interface (en fonction du "bind" fait).

    Le code qui fait "recv" ne recevra que les paquets envoyé sur l'interface à laquelle le socket est bindé... Si il est bindé à 127.0.0.1, il ne recevra donc que les paquets du loopback destinés à 127.0.0.1 (il ne recevra d'ailleurs même pas les paquets 127.0.0.3 par exemple). Il faut donc ne pas le binder, ou le binder à ANY (tout à 0)

    Après, c'est du réseau:
    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
     
    PC #1
       PC lui-même
           Adresse Loopback (vu de lui-même): 127.0.0.1 
           Adresse LAN (vu du réseau local): 192.168.1.4 (par exemple)
           Adresse WAN (aucune)
           Adresse "WiFi Emulateur Android": 10.0.2.15
     
       Emulateur android.
           Adresse Loopback (vu de lui-même): 127.0.0.1 
           Adresse LAN (aucune)
           Adresse "WiFi Emulateur Android": 10.0.2.2
     
    Routeur Internet
           Adresse Loopback (vu de lui-même): 127.0.0.1
           Adresse LAN (vu du réseau local): 192.168.1.1 (par exemple)
           Adresse WAN (vu de l'internet): 215.16.78.23 (par exemple)
     
    Appareil Android
           Adresse Loopback (vu de lui-même): 127.0.0.1
           Adresse WiFi (vrai WiFi du réseau local): 192.168.1.37 (par exemple)
           Adresse 2G/3G/4G: 10.1.2.44
    Donc voila... pour envoyer un paquet de l'émulateur android au PC, il faut envoyer à 10.0.2.2
    Un paquet du device Android au PC quand il est connecté en WiFi: 192.168.1.4
    Un paquet du device Android au PC quand il est connecté en 3G: 215.16.78.23, et faire en sorte que le routeur redirige sur 192.168.1.4
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    J'ai compris ce que tu voulais me dire, donc si je veux envoyer un message de mon PC ( client C) à mon serveur Android il faut que ce dernier fait un bind sur l'adresse du hote qui est la 10.0.2.2 et le client envoie la socket à l'adresse ip de l'émulateur Android, c'est bien ça ?

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    J'ai essayé d'envoyer depuis mon prog C à l'adresse 10.0.2.15 mais le serveur ne répond pas à l'envoi !!

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Svp pouvez vous voir d'où viens le problème ?

  12. #12
    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
    10.0.2.0 est un réseau privé entre l'émulateur et le host....
    Je ne crois pas qu'il y ai de routage entre le "host" et ce réseau là.

    Mais sinon... je reitere ma question.... pourquoi faire un bind ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    @nicroman :
    Ce que je veux savoir c'est pourquoi la réception ne marche pas au niveau du serveur, meme si j'indique au client d'envoyer le paquet à l'adresse du serveur qui est 10.0.2.15 au lieu de 127.0.0.1.

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    SVP je veux avoir des idées sur comment je pourrai faire une communication en udp sous wifi entre mon client (langage C ) et mon serveur Android?

    Je veux des réponses svp!

  15. #15
    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
    J'ai donné déjà toutes les réponses, et la manière de les exiger est un peu déplacée.

    Deux machines sont sur un réseau.... Quelles sont leurs adresses sur ce réseau ?
    Le réseau privé entre l'émulateur et le host c'est 10.0.2.0 .... (avec 10.0.2.2 pour le 'host' et 10.0.2.15 pour l'émulateur).
    Le réseau wifi, ben j'en sais rien c'est ton wifi
    Le réseau Internet, là encore j'en sais rien c'est ton internet et ta 3G....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut Application qui plante lors d'une réception d'un message.
    Merci pour la réponse nicroman,
    Là j'arrive à recevoir le premier message dans le log mais non pas dans l'application serveur où il est cencé s'afficher, et ce message plante en fait l'appli, elle s'arrete soudainement. Je pense que c'est la méthode receive qui la bloque, est ce que quelqu'un peu m'aider là dessus svp!!!

  17. #17
    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
    Il faudrait voire et le code et surtout la stacktrace de l'erreur.

    Si l'application plante il y a forcément dans le logcat du device l'erreur qui a eu lieu, et toute la stack associée...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  18. #18
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Voilà le code que j'ai écrit avec un fichier Log joint:
    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
     
    package com.example.test_udp;
     
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    import java.net.SocketAddress;
    import java.net.SocketException;
    import java.nio.ByteBuffer;
    import java.nio.channels.DatagramChannel;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
     
    public class MainActivity extends Activity{
     
    	public final static int SERVER_PORT = 23456;
    	public final static int MAX_PACKET_SIZE = 65700;
     
    	DatagramSocket socket;
        DatagramPacket packetOut;
        DatagramPacket packetIn;
        DatagramChannel channel;
        byte[] DataIn;
        byte[] DataOut;
    	ByteBuffer buffer;
     
        /*Android widgets*/
        TextView text;
    //    EditText edit;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
     
    		setContentView(R.layout.activity_main);
    		//text = (EditText)findViewById(R.id.editText1);
    		text =(TextView)findViewById(R.id.textView1);	
    		text.setText("");
    		DataOut = new byte[1024];
    		DataIn = new byte[1024];
    		/* Thread for receiving Data from CLient */
    		new Thread(new Receiver()).start();
    			try {	
    		Thread.sleep(500);
    		}catch(InterruptedException e){
    			Log.e("UDP", "UDP receive failed!");
    		}
     
     
    	}
     
    	public class Receiver implements Runnable{
     
    		public void run(){
    			try {
     
    				boolean keepon = true;
    				socket = new DatagramSocket(SERVER_PORT);
    				socket.setBroadcast(true);
    				socket.setReuseAddress(true);
    				packetIn = new DatagramPacket(DataOut,DataOut.length);			
     
    			while(keepon){
    				socket.receive(packetIn);
    				if(socket.isBound()){
    					text.append("source port :" + packetIn.getPort() + "\n");
    					text.append("source address :" + packetIn.getAddress().toString() + "\n");
    				}
    				Log.d("UDP", "Packet receveid");			
    				String message = new String(packetIn.getData());
    				text.append("Message " + message +"\n From " + packetIn.getAddress() + packetIn.getPort() +"\n");
    				Log.d("UDP", "le message reçu");
    				Log.d("Message : ", "" + message);			
     
    				}
     
    			}
    				catch(SocketException exc) {
    					System.out.println("Probleme d'ouverture de la socket");
    				} catch (IOException e) {
    					System.out.println("Probleme de reception");
    					e.printStackTrace();
    				}
    //			try {
    //				if(channel.isOpen())
    //				   channel.close();
    //			} catch (IOException e) {
    //				e.printStackTrace();
    //			}
    			socket.close();
     
    		}
    	}
    }
    Client C:

    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
     
    //----------------------------------------------------------------------------
    #include "biblio.h"
     
    int
    main(int argc,
         char **argv)
    {
    //_________Seting_Destination_IP_adress____________________
     
    in_addr_t ipAddress= inet_addr("10.4.0.156");
     
    //---- create UDP socket ----
    int udpSocket=socket(PF_INET,SOCK_DGRAM,0);
    if(udpSocket==-1)
      { perror("socket"); exit(1); }
     
    struct sockaddr_in toAddr;
    int lenght = sizeof(toAddr);
    int portnumber = 23456;
     
    // ... allowing broadcast (optional)
    int on=1;
        if(setsockopt(udpSocket,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int))==-1)
        { perror("setsockopt"); exit(1); }
     
    int s;
    for(;;)
      {
      //---- read next line on standard input ----   
      char msg[0x100];
      char *buffer = malloc(100);	
      if(!fgets(msg,0x100,stdin)) { break; } 
      //---- send message to the specified destination/port ----
      bzero(&toAddr,lenght);	
      toAddr.sin_family=AF_INET;
      toAddr.sin_port=htons(portnumber);
      toAddr.sin_addr.s_addr=ipAddress;
      s = sendto(udpSocket,msg,strlen(msg),0,(struct sockaddr *)&toAddr,lenght);
    if( s == -1)  
      { perror("sendto"); exit(1); } 
      printf("Sending message ...%s",msg);	
      printf("To destination address %s -- on port : %d \n",inet_ntoa(toAddr.sin_addr),ntohs(toAddr.sin_port));
     
    }
     
    //---- close UDP socket ----
    close(udpSocket);
    return 0;
    }
     
    //----------------------------------------------------------------------------
    Je n'arrive pas vraiment à contourner le problème ;
    Fichiers attachés Fichiers attachés

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    L'erreur est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    Cela veut simplement dire que tu n'as pas le droit de modifier l'interface graphique en dehors du Thread Principal (aussi appelé UI Thread).
    Ton TextView doit être mis à jour depuis ce Thread principal.

  20. #20
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Une réponse logique que j'ai trouvé :

    "You can't modify views from non-UI thread."
    Le thread que j'ai créé n'a pas le droit de toucher au widgets de l'appli...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/04/2012, 10h16
  2. Connexion Java(server) et Python(client)
    Par xeerox23 dans le forum CORBA
    Réponses: 1
    Dernier message: 01/12/2009, 17h22
  3. [Débutant][Sockets] Server en C++, client en Java
    Par mavina dans le forum Réseau
    Réponses: 16
    Dernier message: 05/10/2009, 03h45
  4. [WebService]Server Delphi et client Java
    Par davels dans le forum Web & réseau
    Réponses: 12
    Dernier message: 05/06/2008, 11h11

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