2011-08-28 6 views
2

Dans une application basée sur socket (client/serveur), je veux que le serveur fonctionne comme un proxy (gestionnaire) pour gérer plusieurs clients, et pour recevoir le message d'un client et l'envoyer au client, identifié par un ID.Comment concevoir une application multi-client/serveur?

Comment puis-je connaître le client requis s'exécutant sur un thread différent, comment puis-je obtenir le socket du client associé que l'ID représente?

+0

À qui vote pour clore la question, pourquoi faites-vous cela? Si vous avez un problème, commentez ici !!!!!! – Adham

Répondre

0

Enregistrez les messages à livrer dans une base de données, et assurez-vous que vos threads vérifient la base de données pour les nouveaux messages à livrer à «leurs» clients sur une base régulière. Si vous ne voulez pas de base de données dédiée pour les messages, créez un fichier plat avec des mappages simples ClientID-> Socket et utilisez-le comme un système de recherche de type "annuaire téléphonique". Selon le nombre de clients que vous envisagez d'ajouter, chaque thread peut pré-recharger régulièrement un tel fichier dans sa mémoire pour un accès plus rapide ...

+0

Comment puis-je connaître la prise de destination?! – Adham

+0

Vous n'en avez pas vraiment besoin. Le thread "expéditeur" écrit dans la base de données avec un ID connu sur le client, le thread "client" (qui fonctionne indépendamment) vérifie simplement les nouveaux messages pour son client. Pensez-y comme une sorte de goutte morte - l'un met simplement des choses, l'autre met juste des choses à l'extérieur ... – ty812

+0

Si je ne veux pas utiliser la base de données? Je veux en faire une communication plus en temps réel. c'est possible ? – Adham

1

Vous pouvez conserver beaucoup d'informations sur l'ID à chaque fois qu'il se connecte vous obtenez comme l'ip et sauvegardez le thread sur lequel il s'exécute et ensuite vous utilisez comme hashmap pour lier l'id à toutes ces informations alors vous pouvez facilement obtenir le thread sur lequel il s'exécute et envoyer l'information au bon client

3

Conservez simplement une hashmap en mémoire d'un type d'ID client vers l'objet java.net.Socket qui représente le socket de ce client. Vous devez trouver un moyen d'attribuer des ID clients, soit fournis par le client, soit fournis par le serveur via un schéma d'autorisation.

Lorsqu'un message arrive pour un ID client, récupérez le socket sur la carte et envoyez-lui un message. Cette carte doit être stockée dans un objet de type singleton et doit être correctement synchronisée. Utilisez une carte de hachage simultanée. En outre, les lectures et les écritures de socket doivent être synchronisées si vous utilisez plusieurs threads.

J'ai publié un exemple de code en tant que github gist. C'est un peu différent de ce que j'ai expliqué ci-dessus. Je ne stocke pas de sockets dans la carte, je stocke les gestionnaires de clients qui ont le socket. De plus, les lectures de socket n'ont pas besoin de synchronisation: chaque client a son propre thread qui est le seul thread à lire depuis le socket. Les écritures de socket doivent cependant être synchronisées, car le thread du client d'envoi écrit sur le socket du client de réception.

Vous êtes probablement mieux d'utiliser quelque chose comme JBoss Netty plutôt que de rouler les vôtres.

+0

Je ne comprends pas le point de "Aussi, les lectures et les écritures de socket devraient être synchronisées si vous allez multi-thread." .. B.S.J'ai besoin de faire mon propre parce que je veux comprendre les opérations clairement que je veux implémenter quelqu'un utilisant Android Java. – Adham

+0

Les écritures de socket doivent être synchronisées. Que faire si deux messages arrivent pour le même client? Selon la façon dont vous avez configuré votre serveur, il est possible que vous envoyiez deux messages simultanément au client. Cela pourrait corrompre les données envoyées au client. C'est une question amusante; Je vais coder un petit exemple de ceci et l'afficher dans un petit peu. –

+0

Vraiment j'apprécie que :) – Adham

Questions connexes