Je suis actuellement en train de développer une application Java qui utilise RMI. Le but de cette application est de permettre à plusieurs utilisateur de visualiser un même objet3D au format STEP (lorsque l’un des clients bouge la forme elle bouge chez les autres également etc…).
Mon problème est que j’aimerais depuis un client envoyer au serveur un fichier STEP, puis depuis les autres client télécharger ce même fichier depuis le serveur. J’ai lu que RMI n’était pas adapté à ce genre de chose à cause de la sérialisation.
Quelle méthode méthode me conseilleriez vous d’utiliser pour résoudre ce problème???
Si je comprend bien ton truc, tu va offrir une vue de ton objet 3D à chacun de tes clients?
Je ne sais pas ce que cela donnera réellement, mais voilà ce que j’ai déjà fait - pour un jeu en réseau, un netsnake (j’ai encore les sources, éventuellement, mais y a mon nom et ça ferait tâche!)
Tu vas avoir un serveur, qui va écouter des messages du type “Déplacer à gauche la caméra”, etc, et qui pour chaque action faite va mettre à jour ton modèle 3D.
Ton modèle 3D, s’il est bien conçu n’a plus qu’à envoyer l’ordre de déplacement à chacun des clients sous jacents (les vues distantes). Ce genre de truc se font très bien avec java.nio (même si j’avais utilisé les sockets).
Merci pour ta réponse, mais en fait l’application fonctionne déjà avec RMI. les clients peuvent manipuler la forme CAO dans tout les sens et zoomer également.Ca fonctionne bien!!! le changement s’effectue chez tout les clients grâce à des callbacks. Mais dans mon cas le serveur RMI ne sert qu’a gérer les transmissions entre les clients (entre autre la positions de la vue qui est une matrice de 4x4) .
Mon problème est que pour l’instant j’ai placé mon fichier step sur chaque machine cliente et que chaque client charge le fichier en local.
J’aimerais maintenant que un seul client possède le fichier au début, puis que les autres clients ne le possédant pas puissent le télécharger. Donc je pensais dans un premier temps envoyer le fichier au serveur puis après les autres clients le téléchargent. Tout cela depuis mon application java si possible!
J’aimerais donc pouvoir faire transiter un fichier STEP entre les différents intervenant (upload client vers serveur, puis download client depuis serveur).
voilà 2 solutions que j’envisagais :
serveur ftp ou http
socket java
encapsulation dans un string puis sérialisation avec RMI, mais d’après ce que j’ai pu lire c’est déconseillé de faire comme ca!!!
J’espère avoir été plus clair que dans ma question initial.
Justement, je ne vois pas pourquoi c’est déconseillé.
Le problème est si on sérialize des classes dont la sérilization peut potentiellement être différente entre client et serveur (recompilation)
Alors avec un String (ou même un byte[] ?) aucun problème, à part peut-être la taille, il faut prévoir d’envoyer en plusieurs paquets.
Comme dit deltree, la sérialisation fonctionne très bien en général, faut juste avoir le bon serial uid, etc. Tu peux aussi envoyer un tableau de byte[] que tu interpréteras derrière (ie: ton propre code de sérialisation/désérialisation).
Merci pour vos réponses, je vais donc essayer de mettre en place le transfert de fichier avec RMI. Mais mon problème est que mon application prend en entrée un fichier.
Si j’ai bien compris ce que vous me dites, je dois mettre mettre mon fichier sous forme de String ou de byte, la faire transiter par RMI, puis reconstruire le fichier de l’autre côté???
J’ai vu qu’avec les socket on pouvait utiliser les inputstream et outputstream associé à un ficher de type FILE, comme RMI fait également des sockets puis-je utiliser ces fonctions???
Je connais pas RMI, mais ça doit se baser sur les sockets au final.
Normalement, tu n’as juste que à changer la méthode de sérialisation pour un tableau de byte, ie: dés que tu envoies ton modèle, tu envoie des bytes[] que tu devrais pouvoir relire à la fin.
Ah oui, mais le but de rmi, c’est bien de se passer de la gestion des scokets.
bref sur serveur, il te faut une interface de comm du genre
interface FileSystem{
public String[] dir();
// use readFile(name,0,0) to read all the file, not only a part.
public byte[] readFile(String name, long offset, long length);
}
Après moi, j’ai plus fait du Corba, mais le rmi c’est le même principe.
voilà finalement j’ai utilisé RMI pour transférer mes fichiers. Pour ca je lis le fichier du coté de l’envoyeur et j’envoi avec RMI la string. je recrée un fichier du coté du receveur et copie ce qui arrive dans le fichier.