Bonjour tout le monde.

Je continue mon apprentissage de la programmation réseau, et cette fois j'explore un peu les possibilités de Qt dans le domaine.

Pour me faire la main, j'avais décidé d'essayer de récupérer la date et l'heure sur un serveur NTP.

Rien de très compliqué

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
from PyQt4 import QtNetwork
socket = QtNetwork.QUdpSocket()
socket.connectToHost("0.jp.pool.ntp.org",123)
socket.waitForConnected()
data = '\x1b' + 47 * '\0'
socket.writeData(data)
socket.bytesAvailable() # me renvoie 48, qui sera la longueur de ma réponse
ans = socket.readAll()  # et je décode la structure comme il faut
toutefois, dans la doc de PyQt, j'ai vu qu'on passait parfois par un QDataStream pour sérialiser les données transitant par des sockets.
No problemo, ça me donne

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
from PyQt4 import QtNetwork, QtCore
socket = QtNetwork.QUdpSocket()
socket.connectToHost("0.jp.pool.ntp.org",123)
socket.waitForConnected()
data = '\x1b' + 47 * '\0'
qdata = QtCore.QDataStream(socket)
qdata.writeRawData(data)
socket.bytesAvailable() # me renvoie 48, qui sera la longueur de ma réponse
qdata.readRawData(48)  # et je décode la structure comme il faut
Pour relire ma structure, la QDataStream serait bien utile, aussi j'ai essayé la chose suivante, mais ça ne marche pas.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
from PyQt4 import QtNetwork, QtCore
socket = QtNetwork.QUdpSocket()
socket.connectToHost("0.jp.pool.ntp.org",123)
socket.waitForConnected()
data = '\x1b' + 47 * '\0'
qdata = QtCore.QDataStream(socket)
qdata.writeBytes(data)
socket.bytesAvailable() # me renvoie 48, qui sera la longueur de ma réponse
qdata.readBytes()  
# et là je n'ai plus rien !!!
# ma seule réponse est une chaine vide.
# Par contre, quand je fais un readRawData, ça fonctionne...
Quelqu'un pourrait-il m'expliquer où je me trompe ???
En lisant la doc PyQt, il semblait pourtant que readBytes et readRawData faisaient la même chose ou presque...