data In/Out putStream et available()
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:
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:
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:
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:
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.