Bonjour à tous,
Alors voilà aujourd'hui je fait face à un problème bien ennuyant.
Je suis en train de réaliser une petite application client/serveur, la partie serveur est faite en Java
et la partie cliente en C++ avec Qt
Seulement voilà j'arrive très bien à échanger des informations de type int entre les deux entités (en utilisant
le type qint32 sur la partie cliente) mais lorsqu'il s'agit d'échanger des chaînes de caractère... c'est
une autre histoire.
Alors voilà pour la partie serveur j'utilise un ByteBuffer dans lequel sera stocké toutes mes informations,
puis poussés vers le client. Voici un bref aperçu:
Jusque là tout est bien envoyé au client (normalement...). C'est lorsque je dois récupérer
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 ByteBuffer buffer; DataOutputStream out = new DataOutputStream(socket.getOutputStream()); c.setTime(tickets.get(i).getDate_depart()); c2.setTime(tickets.get(i).getDate_arrivee()); buffer.putInt(0);//Octects réservés pour la taille du block buffer.putInt(PacketsId.BILLET);//Identifiant du paquet buffer.putInt(tickets.get(i).getCode()); buffer.putInt(tickets.get(i).getPrix()); byte[] b2 = "Chaine de test".getBytes(); System.out.println("chaine = " + new String(b2)); buffer.put(b2); tempBuffer = new byte[buffer.position()]; //Ecrase la réserve de 32bits au début du buffer (index 0) pour indiquer la taille //entière du buffer - la taille de deux int (8 octects) réservé pour indiquer //la taille du message et l'id du paquet buffer.putInt(0, buffer.position() - 8); System.out.println("Taille buffer = " + buffer.position() + " (-8) "); for(int i = 0; i < buffer.position(); i++){ tempBuffer[i] = buffer.get(i); } out.write(tempBuffer); out.flush(); buffer.clear();
la chaine de caractère (en l'occurence b2) du coté client que j'ai quelques difficultés.
J'ai essayé le code suivant:
mais sans succès... J'obtiens une chaine hexa du type 0x7fffc5021540.
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 void NetworkUtil::dataReceived(MainWindow &parent, QTcpSocket *socket){ QDataStream in(socket); //Test si le paquet concernant la taille du message est reçu if(receivingSize == 0){ //Nous savons que le paquet concernant la taille fait 4 octects if(socket->bytesAvailable() < (int)sizeof(receivingSize)) return; in >> receivingSize; } //Nous savons que le paquet concernant le packetId fait 4 octects. //Nous attendons donc l'arrivee de 4 octects consecutifs if(socket->bytesAvailable() < (int)sizeof(packetId)) return; in >> packetId; qDebug() << "Packet Id = " << packetId; //Si le nombre d'octects disponibles dans le socket est inferieur à //la taille renseignee precedement dans receivingSize alors on //attends l'arrivee de plus de paquets if(socket->bytesAvailable() < receivingSize) return; //Ici nous possedons le message complet (socke dans la variable in) //ainsi que l'ID du paquet stocke dans packetId qDebug() << "Paquet: Taille du message (en octects) = " << receivingSize; switch(packetId){ case PacketsId::NOMBRE_BILLETS_NON_RESERVES: in >> DataEnums::NB_PLACES_LIBRES; qDebug() << "Nb places = " << DataEnums::NB_PLACES_LIBRES; break; case PacketsId::BILLET: handleTicketPacket(in, receivingSize); break; } //Nous pouvons remettre receivingSize à 0 receivingSize = 0; qDebug() << "Bits restants " << socket->bytesAvailable(); if(socket->bytesAvailable() > 0) dataReceived(parent, socket); } void NetworkUtil::handleTicketPacket(QDataStream &in, qint32 receivingSize){ Ticket tempTicket; Date tempDateDep, tempDateArr; qint32 tempInt32Buff; //32 est la taille occupé par les différents paramètres (int) du billet qint32 paysArraySize = receivingSize - 32; QChar tempStr[paysArraySize]; in >> tempInt32Buff; tempTicket.setCode(tempInt32Buff); in >> tempInt32Buff; tempTicket.setPrix(tempInt32Buff); //Ici in pointe sur le début de la chaîne //J'ai enlevé de nombreuses lignes de //code inutiles for(int i = 0; i < paysArraySize; i++){ in >> tempStr[i]; } qDebug() << "tempStr = " << tempStr; tempTicket.setPaysArr(QString(tempStr)); }
Je suis certain que mon dataStream "in" pointe bien sur la début de ma chaine
lorsque je veux faire ma manipulation sur la chaine. De même QChar de Qt et String
de Java sont bien encodés en UTF-8 non?
Quelqu'un a une idée de comment je pourrais traiter la chaine reçu dans la partie client
pour me voir restituer ma chaine d'origine envoyé depuis le programme Java?
Merci d'avance.
Partager