2013-04-29 1 views
0

J'ai réussi à envoyer un message client -> serveur et à connecter plusieurs clients simultanément. Mais ce que je veux faire est de connecter 2 clients et de les faire discuter entre eux. Et si le troisième client se connecte, alors il commence à discuter avec les deux autres clients. Maintenant, je suis sur le point de discuter client-> serveur-> client séparément d'un autre c-> s-> c. Ce qui se passe est - je cours client1 et tout est OK. Ensuite, je lance client2 et tout est OK, mais le premier client arrête de fonctionner et le premier message que j'acquiers sur le second client est le dernier message que j'ai envoyé de client1 (mais qui ne lui a pas été réellement renvoyé par le serveur). Je suppose donc qu'il y a un problème avec les flux - que les deux clients acquièrent en quelque sorte les flux de l'autre. Voici les quelques parties du serveur (ceux concernés): TheServerC# - streaming client dans un serveur multithread

HandleClientComm (client de l'objet) traite la réception-envoi des opérations.

Et voici la partie de code côté client, qui gère la réception-envoi des opérations: TheClient

Et je reçois An unhandled exception of type 'System.OutOfMemoryException' occurred... dans dans le serveur à Byte[] bData = new Byte[BitConverter.ToInt32(bSize, 0)];

sooo ... oui, il y a Quelque chose ne va pas avec les cours d'eau (à mon avis). Mais je ne sais pas vraiment comment faire la distinction entre les threads des clients.

Je suis ouvert pour toutes suggestions.

P.S. Je ne poste pas le code directement ici parce que ça va devenir trop long.

Répondre

1

Ceci est la première partie de HandleClientComm():

private void HandleClientComm(object client) 
{ 
    TcpClient tcpClient = (TcpClient)client; 
    NetworkStream stm = clientList[n].GetStream(); 
    msg = new TheMessage(); 

Vous avez le tcpClient, qui est le client que vous avez envoyé en tant que paramètre, mais le NetworkStream est pas que client, mais pour clientList[n] et n est une variable à l'échelle de la classe. Plus tard dans cette méthode, dans la boucle while, vous utilisez:

stm = clientList[n].GetStream(); 

Dès que vous augmentez n, tous les threads en cours d'exécution HandleClientComm() recevront et envoyer des messages de/vers le dernier client.

Le NetworkStream que vous utilisez dans HandleClientComm() devrait être créé à partir de la place tpcClient, de sorte que chaque fil conducteur HandleClientComm() sert son propre client:

stm = theClient.GetStream(); 
+0

Merci, ça a marché! :) Ce qui reste maintenant est de le faire discuter entre les clients et si j'ai 4 clients, puis faire en sorte que chaque client trouve un autre point de terminaison et ne pas mélanger entre plus de 2 clients. Mais que je vais comprendre (j'espère ...). :) – Milkncookiez

Questions connexes