2010-03-02 3 views
1

Je travaille sur un projet JAVA dans lequel il y a plusieurs terminaux. Ces terminaux agissent en tant que client et serveurs. Par exemple s'il y a 3 terminaux A, B et C. À un moment donné, l'un d'entre eux dit A, sera un client faisant une demande de diffusion. Les deux autres terminaux, B et C, répondront. J'utilise des prises pour les faire communiquer. Une fois la réponse reçue de tous les autres terminaux, A vérifie le pool de canaux pour voir si l'un des canaux est libre. Il prend le canal libre et le rend disponible faussement.Transfert de HashMap entre le client et le serveur en utilisant Sockets (JAVA)

Le channelpool est mis en oeuvre en utilisant hashmap:

HashMap channelpool = new HashMap();

channelpool = 1 = true, 2 = true, 3 = false, 4 = true, 5 = true, 6 = true, 7 = true, 8 = true, 9 = true, 10 = true

Ainsi Au départ, tous les canaux sont vrais, n'importe quel terminal peut prendre n'importe quel canal. Mais une fois le canal pris, il est défini sur false pour la période d'utilisation, puis réinitialisé sur true.

Maintenant, cette Hashmap doit être partagée entre les terminaux distribués. En outre, il devrait être maintenu à jour. Je ne peux pas utiliser une ressource partagée entre les terminaux pour stocker le HashMap. Quelqu'un peut-il me dire un moyen facile de transférer le HashMap entre les terminaux. J'apprécierais que quelqu'un puisse me diriger vers un site Web qui en parle.

Répondre

3

Vos problèmes commencent beaucoup plus tôt qu'avec l'envoi d'un HashMap sur un socket. Comment vous assurez-vous qu'un seul processus à la fois modifie la carte? Si deux processus modifient la carte, comment consolidez-vous les changements de la même manière pour chaque processus?

Mais pour répondre à votre question: Sérialiser le HashMap en utilisant java.io.ObjectOutputStream, puis en le reconstruisant de l'autre côté en utilisant ObjectInputStream, devrait faire l'affaire.

1

Exactement. Transférer HashMap est sujet aux mêmes problèmes de concurrence que vous essayez de résoudre avec, donc ce n'est pas la solution. Au contraire, cela fait partie du problème, et une partie inutile. Vous avez besoin d'un serveur central pour gérer les allocations pour vous, que vous pouvez implémenter via RMI, ou plus probablement une base de données plutôt qu'un HashMap.

+0

Merci Meriton et EJP pour vos réponses. Je comprends que le transfert de la hashmap est une tâche facile. J'utilise java.io.ObjetOutputStream comme suggéré. Comme vous l'avez souligné, comment vais-je m'assurer qu'un seul processus change la HashMap à la fois? Je suis nouveau à la programmation distribuée. Je ne sais pas comment utiliser le RAV JAVA et tout. L'utilisation de RMI est-elle la seule solution ou existe-t-il une solution plus facile? – sar

+0

RMI est la solution la plus simple que je peux penser. – EJP

0

Pas besoin de sérialisation RMI ou d'objet. Votre serveur (s) doit avoir Hazelcastdistributed map. Les machines virtuelles Java clientes doivent utiliser Hazelcast Client pour accéder à la carte distribuée partagée. Les clients peuvent écouter les événements de carte distribués. Hazelcast est une implémentation transactionnelle, open source (licence Apache), distribuée, distribuée de services de carte, multimap, file, sujet, verrou et exécuteur pour Java.

Questions connexes