> Tech > Requêtes de base, lister les Clients suivis sur le serveur

Requêtes de base, lister les Clients suivis sur le serveur

Tech - Par iTPro - Publié le 24 juin 2010
email

Sur le serveur, chaque objet CustomerHostSocket créé dans la boucle principale de la classe CustomerHostServer est chargé de communiquer avec un client unique et d'agir sur des requêtes spécifiques provenant de ce client. La figure 6 montre les méthodes définies pour la classe CustomerHostSocket.
Les types de requêtes sont traités

dans la méthode run de la classe CustomerHostSocket.
Un travail d’intendance initial établit une connexion de base de données et prépare
plusieurs instructions SQL pour uen exécution ultérieure. Ensuite, une instance
de la classe DataInputStream est construite sur le flux d’entrée simple du socket.
Cet objet permet au serveur de lire les requêtes de type entier écrites dans le
flux par le client.



d_input = new DataInputStream

(getInputStream());




Vient ensuite une boucle while. Elle reçoit et traite les requêtes client jusqu’à 
ce que le client demande explicitement de se déconnecter du serveur. Le code de
requête ci-dessous s’arrête sur la méthode readInt jusqu’à  ce que le client envoie
une requête.



while(true)

{

int requestType = d_input.readInt();

if(requestType == RQS_LIST)

list();

else if(requestType == RQS_ADD)

add();

else if(requestType == RQS_CHANGE)

change();

else if(requestType == RQS_DELETE)

delete();

else if(requestType == RQS_QUIT)

{

quit();

break;

}

}




Dans l’exemple de requête, quand le client envoie le type de requête RQS_LIST,
le serveur exécute sa méthode list. Voici le code qui crée cette méthode :



Hashtable h = new Hashtable(100);

ResultSet rs = pSelect.executeQuery();

while(rs.next())

{

CustomerItem tempItem =

new CustomerItem(

(rs.getBigDecimal(« CUSTID », 0))

.intValue(),

rs.getString(« CUSTNAME »),

rs.getString(« CUSTSTREET »),

rs.getString(« CUSTCITY »));

h.put(new Integer(tempItem.getID()),

tempItem);

}



ObjectOutputStream output =

new ObjectOutputStream(

getOutputStream());

output.writeObject(h);



Remarque : L’instruction SQL préparée pSelect se présente ainsi :



pSelect = dbConn.prepareStatement

« SELECT * FROM  » +

« EXAMPLES.CUSTMAST ORDER BY CUSTID »);




Le serveur interroge la table CUSTMAST et crée une table de hachage contenant
un objet CustomerItem pour chaque enregistrement de base de données. Ensuite,
le serveur envoie la table de hachage au client par l’intermédiaire d’un flux
de sortie d’objet.



Le mécanisme par lequel les objets peuvent être écrits dans les flux et
lus à  partir des flux est appelé sérialisation



Le mécanisme par lequel les objets peuvent être écrits dans les flux et lus à 
partir des flux est appelé sérialisation. C’est un terme Java qui désigne la traduction
du contenu d’un objet en un flux standardisé d’octets. Dès lors qu’un objet est
sérialisé, il peut être écrit intact dans un fichier stream ou, comme dans cette
application, échangé avec un autre système par l’intermédiaire d’une flux de socket.



L’action de sérialisation est complexe. Au lieu de ne considérer qu’une classe,
le processus de sérialisation explore la hiérarchie de classes pour sauvegarder
des informations provenant des superclasses de la classe que l’on est en train
de sérialiser. Heureusement le langage Java fournit aux programmeurs d’applications
un mécanisme très simple, en cachant soigneusement les complexités de la sérialisation.

Dans l’application Customer Tracking, la classe CustomerItem doit être capable
de sérialisation afin que les objets Clients suivis puissent être échangées entre
client et serveur. Pour rendre la classe CustomerItem apte à  la sérialisation,
il doit implémenter l’interface Serializable à  partir du package java.io :



public class CustomerItem implements

java.io.Serializable




Contrairement à  la plupart des interfaces, l’interface Serializable ne contient
pas de signatures de méthodes. L’interface Serializable vide ne sert qu’à  indiquer
clairement que nous voulons que la classe CustomerItem participe à  la sérialisation.



Les classes ObjectInputStream et ObjectOutputStream de Java fournissent un type
de sérialisation que l’on peut utiliser dans ses applications. Dans le cas d’un
flux d’entrée, la classe ObjectInputStream fournit une méthode readObject. Pour
le ObjectOutputStream, la méthode fournie est writeObject.

Examinons à  nouveau les deux dernières instructions dans la méthode de liste :



ObjectOutputStream output =

new ObjectOutputStream(

getOutputStream());

output.writeObject(h);




Comme on peut le voir, une instance de la classe ObjectOutputStream est créée
sur le flux de sortie simple du socket serveur, puis toute la table de hachage
est sérialisée et envoyée au client par la méthode writeObject.



Sockets en vue !

J’espère que cet aperçu de la programmation des sockets Java suscitera votre intérêt
et vous incitera à  développer des solutions de communications similaires dans
vos applications client/serveur de type Java. Pour en savoir plus sur l’application
Customer Tracking et la programmation sockets Java, on peut lire le chapitre 6
de Java and the AS/400 : Practical Examples Using VisualAge for Java (29th Street
Press, 1999).

Téléchargez gratuitement cette ressource

Guide des Services Managés pour se moderniser et se sécuriser

Guide des Services Managés pour se moderniser et se sécuriser

À l’heure où les talents du numérique sont rares et difficiles à séduire, comment bénéficier des meilleures compétences en infrastructure Cloud ou en cybersécurité pour gagner en agilité et en cyber-résilience ? Découvrez le Guide des Services managés dédiés aux PME.

Tech - Par iTPro - Publié le 24 juin 2010