2017-04-08 1 views
1

Je veux essentiellement pour y parvenir:Comment faire pour que 2 threads du serveur communiquent avec 2 threads client?

ServerThreadA       ClientThreadA 
      \      /
       --->>>--->>>--->>>--- 
         SOCKET 
       --->>>--->>>--->>>--- 
      /      \ 
ServerThreadB       ClientThreadB 

Ce qui se passe ici est que j'ai 2 threads sur le serveur d'envoyer des données à 2 fils respectifs sur le côté client. Pour être plus précis, j'ai besoin d'utiliser .writeUTF (String) à partir de DataOutputStream sur le serveur et .readUTF() à partir de DataInputStream sur le client. Lorsque ServerThreadA écrit quelque chose dans le flux, seul ClientThreadA le lit, et pas ClientThreadB. De la même manière, je ne veux pas que ClientThreadB lise ce que ServerThreadA a écrit.

Y a-t-il un moyen d'y parvenir?

EDIT:
Je pense que je l'ai expliqué mal: je sais déjà comment faire un serveur qui peut accepter des connexions multiples et donner à chacun d'eux un fil à travailler, ce que je suis en train de est d'avoir plusieurs communications se déroulant dans la même direction et dans le même client. Supposons que le serveur se connecte à un client, un thread est créé pour représenter la connexion, mais ce que je veux faire, c'est lire deux canaux différents, si vous voulez, en transférant différents types de données. Par exemple je voudrais que le client envoie deux chaînes simultanément et que le serveur les lise en même temps

Répondre

2

Modifie le protocole de façon à ce qu'un nombre soit écrit avant chaque chaîne: 0 si le message est pour ClientThreadA, et 1 si le message est pour ClientThreadB. Au niveau du serveur, démarrez un ClientThread0 qui doit lire toutes les données d'entrée du socket.Il lit un nombre puis une chaîne dans une boucle. Puis passe la chaîne au fil approprié en fonction du nombre. Pour passer des messages de ClientThread0 à ClientThreadA/B, BlockingQueue<String> s sont utilisés. ClientThread0 appelle queue.put(string) et ClientThreadA/B appelle queue.take().

0

Je pense que votre compréhension du fonctionnement des serveurs est fausse. Cette image devrait ressembler beaucoup à:

ServerThreadA --->>>--->>>--->>>--- ClientThreadA 

ServerThreadB --->>>--->>>--->>>--- ClientThreadB 

Le point est: le code du serveur attend sur un socket serveur; et quand un nouveau client entre et accept() vous donne un socket "dédié" pour parler à ce client. En d'autres termes: quel que soit le nombre de threads client connectés à votre serveur; et peu importe combien de threads de serveur prennent soin d'eux; il y a toujours une prise spécifiquepar client.

Il n'y a pas de partage de sockets; il n'y a donc pas besoin de s'inquiéter des messages qui pourraient aller à plus d'un client!

Et quand vous pensiez à "partager" des sockets pour permettre à un côté d'envoyer des messages à tous les pairs de l'autre côté, alors vous devez faire de différentes façons!

+0

Je pense que je pourrais avoir mal expliqué: je sais déjà comment faire un serveur qui peut accepter plusieurs connexions et donner à chacun d'eux un fil sur lequel travailler, ce que j'essaie de faire est de multiples communications en cours dans la même direction et dans le même client. Supposons que le serveur se connecte à un client, un thread est créé pour représenter la connexion, mais ce que je veux faire, c'est lire deux canaux différents, si vous voulez, en transférant différents types de données. Par exemple je voudrais que le client envoie deux chaînes simultanément et que le serveur les lise * en même temps * –

1

Vous pouvez utiliser le ServerSocket pour le serveur où le sever accepte le numéro de port qui sont passés ou appelés par le client.

Les deux utilisent le même numéro de port pour la communication.

De nombreux clients peuvent appeler le serveur. Comme le serveur de requête client (sur ce numéro de port) accepte la requête du client, cela signifie que le client se joint au serveur.

+1

Je pense que j'aurais pu mal expliquer: je sais déjà comment faire un serveur qui peut accepter plusieurs connexions et donner à chacune d'eux un fil sur lequel travailler, ce que j'essaye d'avoir plusieurs communications se passe dans la même direction et dans le même client. Supposons que le serveur se connecte à un client, un thread est créé pour représenter la connexion, mais ce que je veux faire, c'est lire deux canaux différents, si vous voulez, en transférant différents types de données. Par exemple je voudrais que le client envoie deux chaînes simultanément et que le serveur les lise * en même temps * –

+1

vous voulez dire que deux clients différents envoient les deux données différentes à un seul serveur et le serveur accepte les deux données en même temps. –

+1

Non, chaque client envoie deux données différentes au serveur. Le problème est que cela doit se produire simultanément en utilisant multithreading –