2010-04-11 4 views
2

Je suis en train de concevoir une application de chat client-serveur en Java. C'est une application sécurisée où les messages sont échangés en utilisant des algorithmes cryptographiques. J'ai un serveur et il peut supporter beaucoup de clients. Mon problème est que lorsqu'un client ouvre une session sur le serveur, cela fonctionne correctement, mais lorsqu'un autre utilisateur se connecte au système, le serveur commence à me donner de mauvaises exceptions de remplissage pour le texte chiffré.Problème de simultanéité en Java

Je ne suis pas capable de comprendre le problème, selon ma logique, quand une nouvelle demande de connexion au serveur est faite, le serveur crée un fil pour l'écoute du client. Est-il possible qu'une fois l'instance de classe de threads créée, elle effectue tout le traitement correctement pour le premier client, mais pas pour le second client car les variables de la classe de thread d'écoute de serveur ont déjà une valeur précédente, et donc le texte crypté pas décrypté correctement?

Veuillez indiquer comment rendre ce processus plus robuste afin que le nombre de clients n'affecte pas le fonctionnement du serveur.

Salut, Le code est comme ceci:

Lorsque Server démarre:

Socket in= serverSocket.accept(); 

       Receive rlt = new Receive(in); 
       Thread receiveReq = new Thread(rlt); 
       receiveLoginReq.start(); 

maintenant Receive thread attend le message entrant et faire le processus selon le type de message. Lorsque plus d'un client est appelé, le serveur fonctionne correctement, le problème démarre lorsqu'un client se termine et tente à nouveau de se reconnecter. Serveur donne toujours l'erreur dans le modèle suivant:

  1. Première fois le hash pas d'erreur adapté pour la deuxième client
  2. de javax.crypto.BadPaddingException temps Deuxième: Compte tenu de bloc final pas d'erreur correctement rembourrée

Lorsque cela arrive, j'ai besoin de redémarrer le serveur et redémarrer les deux clients, seulement alors les deux clients fonctionne. mais encore une fois si un client met fin à la connexion et essaie à nouveau de se reconnecter, les mêmes 2 erreurs se produisent de la même manière. puis redémarrez le serveur.

Toute recommandation sera grandement appréciée. Merci

+0

Certains codes iraient de pair en nous permettant de vous aider avec votre problème. –

+0

Le titre ne doit pas sonner "Gestion de la mémoire Java" mais plutôt "problème de simultanéité". Si vous avez fourni un code source plus peut être dit à propos de ce problème. –

+0

Il semble que tous les threads client accèdent aux mêmes données, auquel cas vous devrez probablement utiliser des blocs synchronisés. –

Répondre

1

Ne partagez pas les données modifiables avec les unités d'exécution. Utilisez le style fonctionnel - aucun état d'objet. Si vous avez vraiment besoin de partager des données avec les threads, utilisez le passage de message.

Vérifiez que vous fermez les connexions correctement.

Vous pouvez utiliser un vrai serveur comme Jetty qui est très facile à installer.

+0

L'utilisation de Jetty avec HTTPS comme serveur est une bonne idée. Le seul inconvénient par rapport à la connexion TCP ordinaire est que le serveur ne peut pas transmettre les données au client. Le client doit interroger périodiquement pour les mises à jour. –

0

Découvrez la classe java.lang.ThreadLocal.

0

Je ne peux que deviner les raisons sans voir le code source complet. Je suppose que vous utilisez CipherInput/OutputStream pour votre cryptage. Vous devez utiliser des instances séparées de Cipher pour chaque thread (chaque I/OStream). Chaque fois que vous créez une nouvelle connexion ou que vous vous reconnectez, exécutez la méthode init de Cipher à la fois côté client et serveur et créez de nouvelles instances CipherInput/OutputStream.

Les objets cryptographiques sont à état, par conséquent, ils ne peuvent pas être partagés entre threads. Chaque thread et chaque connexion doit avoir ses propres ensembles d'objets avec état.