android : protocole UDP
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

android : protocole UDP



  1. #1
    cosmoff

    android : protocole UDP


    ------

    Bonjour,

    j'essaye de communiquer avec mon serveur mais quand je lance mon programme, celui m'affiche le message d'erreur suivant :
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: java.net.SocketException: socket failed: EACCES (Permission denied)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at libcore.io.IoBridge.socket(IoB ridge.java:619)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at java.net.PlainDatagramSocketIm pl.create(PlainDatagramSocketI mpl.java:93)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at java.net.DatagramSocket.create Socket(DatagramSocket.java:157 )
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at java.net.DatagramSocket.<init> (DatagramSocket.java:80)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at com.example.pac.robot.MainActi vity.client(MainActivity.java: 89)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at com.example.pac.robot.MainActi vity$1.onClick(MainActivity.ja va:55)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at android.view.View.performClick (View.java:5721)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at android.widget.TextView.perfor mClick(TextView.java:10930)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at android.view.View$PerformClick .run(View.java:22620)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at android.os.Handler.handleCallb ack(Handler.java:739)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at android.os.Handler.dispatchMes sage(Handler.java:95)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at android.os.Looper.loop(Looper. java:148)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at android.app.ActivityThread.mai n(ActivityThread.java:7331)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at java.lang.reflect.Method.invok e(Native Method)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at com.android.internal.os.Zygote Init$MethodAndArgsCaller.run(Z ygoteInit.java:1230)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at com.android.internal.os.Zygote Init.main(ZygoteInit.java:1120 )
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: Caused by: android.system.ErrnoException: socket failed: EACCES (Permission denied)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at libcore.io.Posix.socket(Native Method)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at libcore.io.BlockGuardOs.socket (BlockGuardOs.java:282)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: at libcore.io.IoBridge.socket(IoB ridge.java:604)
    03-05 16:34:50.523 20098-20098/com.example.pac.robot W/System.err: ... 15 more


    j'ai essayé de résoudre le probleme en mettant dans AndroidManifest.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.pac.robot ">

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
    <intent-filter>
    <action android:name="android.intent.a ction.MAIN" />

    <category android:name="android.intent.c ategory.LAUNCHER" />
    <uses-permission android:name="android.permissi on.INTERNET" />
    <uses-permission android:name="android.permissi on.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permissi on.ACCESS_WIFI_STATE" />
    </intent-filter>
    </activity>
    </application>

    </manifest>

    mais ca ne marche toujours pas,

    je vous montre mon code :

    Code:
     public void client(String str) throws IOException {
    
    
            DatagramSocket client_socket = new DatagramSocket(15000);
            InetAddress IPAddress =  InetAddress.getByName("192.168.0.42");
    
            DatagramPacket send_packet = new DatagramPacket(str.getBytes(),str.length(), IPAddress, 15000);
            client_socket.send(send_packet);
    
    }
    public View.OnClickListener avancerListen = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("message","you clicked on avancer");
                try {
                    client(str);// str = "Hello"
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
    merci d'avance pour votre aide

    -----

  2. #2
    satinas

    Re : android : protocole UDP

    Salut, pourquoi mets-tu les <uses-permission> à l'intérieur de <intent-filter>
    Je les mets juste avant <application>
    Une seule permission devrait suffire pour les sockets.
    <uses-permission android:name="android.permissi on.INTERNET"/>

  3. #3
    cosmoff

    Re : android : protocole UDP

    merci de ta réponse, je ne pensais pas que l'endroit avait une importance, j'ai mis le code suivant recopié sur le net :
    Code:
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            b_avancer = (Button) findViewById(R.id.avancer);// on fait pointé le pointeur à l'adresse mémoire de avancer
            b_reculer = (Button) findViewById(R.id.reculer);
            b_droite = (Button) findViewById(R.id.droite);
            b_gauche = (Button) findViewById(R.id.gauche);
    
            b_avancer.setOnClickListener(avancerListen);
            b_reculer.setOnClickListener(reculerListen);
            b_droite.setOnClickListener(droiteListen);
            b_gauche.setOnClickListener(gaucheListen);
    
            String text;
            String messageStr="Hello Android!";
            int server_port = 15000;
            DatagramSocket s = null;
            try {
                s = new DatagramSocket();
            } catch (SocketException e) {
                e.printStackTrace();
            }
            InetAddress local = null;
            try {
                local = InetAddress.getByName("192.168.0.42");
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
            int msg_length=messageStr.length();
            byte[] message = messageStr.getBytes();
            DatagramPacket p = new DatagramPacket(message, msg_length,local,server_port);
            try {
                s.send(p);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
        }
    et j'ai maintenant l'erreur :
    03-05 17:24:48.703 7535-7535/com.example.pac.robot E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.pac.robot, PID: 7535
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pac. robot/com.example.pac.robot.MainActi vity}: android.os.NetworkOnMainThread Exception
    at android.app.ActivityThread.per formLaunchActivity(ActivityThr ead.java:3319)
    at android.app.ActivityThread.han dleLaunchActivity(ActivityThre ad.java:3415)
    at android.app.ActivityThread.acc ess$1100(ActivityThread.java:2 29)

    je precise que sans le code udp tout fonctionne (boutton...), mais des que je rajoute ce code Udp ca me met toutes ces erreurs
    Dernière modification par cosmoff ; 05/03/2017 à 16h26.

  4. #4
    satinas

    Re : android : protocole UDP

    Tant que ça marche pas, laisse les 3 permissions, après on verra ...

  5. A voir en vidéo sur Futura
  6. #5
    satinas

    Re : android : protocole UDP

    Tu testes sur quelle version d'Android ?
    Tu dois peut-être dans ce cas-là :
    http://www.androiddesignpatterns.com...ycomb-ics.html
    Dernière modification par satinas ; 05/03/2017 à 16h47.

  7. #6
    cosmoff

    Re : android : protocole UDP

    oui le probleme est qu'il faut que je mette en place des threads, j'ai recupéré le code :

    Code:
    private AsyncTask<Void, Void, Void> async_cient;
        
    
        private void runUdpClient() {
            final int UDP_SERVER_PORT = 15000; //<=== numéro de port
            async_cient = new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    String udpMsg = "hello raspberry i am android ";
                    DatagramSocket ds = null;
                    try {
                        ds = new DatagramSocket();
                        InetAddress serverAddr = InetAddress.getByName("192.168.0.42"); //<== IP du serveur distant
                        DatagramPacket dp;
                        dp = new DatagramPacket(udpMsg.getBytes(), udpMsg.length(), serverAddr, UDP_SERVER_PORT);
                        dp.setData(udpMsg.getBytes());
                        ds.send(dp);
                    } catch (Exception e) {
                        Log.e("UDPTest", "Problème d'envoi datagram", e);
                    } 
                    return null;
                }
                protected void onPostExecute(Void result) {
                    super.onPostExecute(result);
                }
            };
            if (Build.VERSION.SDK_INT >= 11)
                async_cient.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
            else async_cient.execute();
        }
    et ca marche, mais je coince un peu dans la compréhension du thread, en faite le programme va tout le temps rester en arriere plan sans jamais s'arreter ?

    comment je peux faire pour envoyer un message car lors d'un appuye sur un bouton je dois changer la valeur de udpMsg
    Dernière modification par cosmoff ; 05/03/2017 à 17h46.

  8. #7
    satinas

    Re : android : protocole UDP

    Le principe de l'AsyncTask, c'est de créer un thread simplifié dont l'exécution ne doit pas dépasser quelques secondes. Il communique avec le thread principal par des fonctions callback. Tu peux lui passer des paramètres dans la fonction execute().
    Tu les prends ou tes sources ?

Discussions similaires

  1. Programmation mobile Android avec Android Studio
    Par Gilles BILLARD dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 12/02/2017, 09h25
  2. Ihm android
    Par SUPER_COP dans le forum Technologies
    Réponses: 0
    Dernier message: 30/10/2016, 13h49
  3. Android
    Par ousmane21 dans le forum Technologies
    Réponses: 1
    Dernier message: 05/02/2014, 18h46
  4. protocole normal vs protocole prioritaire
    Par invite74119562 dans le forum Électronique
    Réponses: 0
    Dernier message: 13/01/2010, 12h31