Bonjour,
je reprends actuellement le code d'un projet qui communique avec une puce embarquée programmée en C.
La communication se fait via des DataInputStream et dataOutputStream comme suit:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
public Network(Socket socket) {
        try {
            this.socket = socket;
            this.dis = new DataInputStream(socket.getInputStream());
            this.dos = new DataOutputStream(socket.getOutputStream());
         } catch (IOException ex) {
            Logger.getLogger(Network.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
le client (ici le matériel embarqué donc) se connecte sur un port, on récupere la socket via un accept -> donc TCP et on la passe à la classe Network qui va gérer les stream.
jusque là pas de soucis.

pour lire et ecrire on passe par des tableau de byte comme ceci:

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
public boolean sendTrame(String trame) {
        try {
            int z;
            int i = 0;
            int j;
            String Hex;
            byte buffer[] = new byte[trame.length() / 2];
            for (z = 0; z < (trame.length()); z++) {
                Hex = "";
                Hex = Hex + trame.charAt(z);
                z++;
                Hex = Hex + trame.charAt(z);
                j = Integer.parseInt(Hex, 16);
                buffer[i] = (byte) (j & 0xFF);
                i++;
            }
            while(dis.available() > 0) { //On vide le stream au cas ou
                dis.readByte();
            }
            dos.write(buffer);
            dos.flush();
        } catch (IOException ex) {
            console.traceError("NETWORK_MANAGER", "sendTrame" , ex);
            return false;
        } catch (IndexOutOfBoundsException ex) {
            return false;
        }
        return true;
    }
et ceci:

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
public String receiveTrame() {
        byte[] messageByte = new byte[512];
        String trame = null;
        int size = 0;
        try{
            while (dis.available()>0) {
                messageByte[size] = dis.readByte();
                size++;
            }
        } catch (IOException ex) {
         console.traceError("NETWORK_MANAGER", "receiveTrame", ex); //Fin de stream normalement detecté via dis.available()
        }
        if(size > 0) trame = "";
        else console.traceError("NETWORK_MANAGER", "Aucune réponse");
        for (int i = 0; i < size; i++) {
            trame = trame + String.format("%02X", messageByte[i] & 0xFF);
        }
        return trame;
    }
je l'utilise donc comme cela:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
                socket = clients.getClient(); //il se cache derrière un ArrayList<Socket>() en attente de traitement créée avec un accept() dans un autre thread
                socket.setKeepAlive(true);
                socket.setSoTimeout(5000);
                network = new Network(socket, true);
                network.sendTrameDmeLan(maRequete);
                trame = network.receiveTrameDmeLan();
Mon problème c'est que je reçois 8 fois sur 10 une erreur sur la lecture: je retrouve dis.avalaible() == 0 dans la plupart des cas...
je passe probablement à cotes d'un truc con mais je n'arrive pas à trouver quoi :/
pour moi dis.readByte() et sensé être bloquant tant que je n'ai rien dans le stream. vu qu'il est vidé avant je devrait y trouver la réponse de ma puce embarqué du coup...

voilà en gros mon problème... merci à vous pour vos éventuelles réponses.