TCPlistener, envoi d'un message à tous les utilisateurs connectés [Résolu]

Messages postés
22
Date d'inscription
mercredi 24 octobre 2007
Dernière intervention
1 décembre 2009
- - Dernière réponse : t0fx
Messages postés
22
Date d'inscription
mercredi 24 octobre 2007
Dernière intervention
1 décembre 2009
- 1 déc. 2009 à 15:02
Bonjour à tous ! J'essaye de créer une application de Chat multi postes, j'en suis au tout début et j'aurai besoin d'un peu d'aide pour un bout de code !
J'ai plusieurs ordinateurs qui se connectent à moi et j'aimerai envoyer un message général à tous les connectés. Voilà le code source de l'application :

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace LanChat
{
    public partial class Form1 : Form
    {
        public int Computers = 0;
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
        }

        public void button1_Click(object sender, EventArgs e)
        {

            if (button1.Text == "Listen")
            {
                TcpListener = new TcpListener(IPAddress.Any, Convert.ToInt32(textPort.Text));
                ListenThread = new Thread(ListenForClients);
                ListenThread.Start();
                button1.Text = "Stop";

            }
            else
            {
                button1.Text = "Listen";
                TcpListener.Stop();
                ListenThread.Abort();
                ListenThread.Interrupt();
                textOut.Clear();
             }
        }

        public void Form1_Load(object sender, EventArgs e)
        {
            notifyIcon1.BalloonTipTitle = "Welcome!";
            notifyIcon1.BalloonTipText = "LanChat Loaded!";
            notifyIcon1.ShowBalloonTip(2000);
        }

        public TcpListener TcpListener;
        public Thread ListenThread;


        public void ListenForClients()
        {
            TcpListener.Start();

            while (true)
            {
                //Attente de connexions
                var client = TcpListener.AcceptTcpClient();

                //création d'un thread pour gérer les communications
                //avec chaque client
                var clientThread = new Thread(HandleClientComm);
                clientThread.Start(client);
            }
        }

        public void HandleClientComm(object client)
        {
            var tcpClient = (TcpClient)client;
            var clientStream = tcpClient.GetStream();
            Users++;
            lblusers.Text = "( Status : " + Computers + " )";
            var message = new byte[4096];

            while (true)
            {
                int bytesRead;
                ASCIIEncoding encoder;
                try
                {
                    encoder = new ASCIIEncoding();
                    byte[] buffer = encoder.GetBytes("Ping");
                    clientStream.Write(buffer, 0, buffer.Length);
                    clientStream.Flush(); 
                    //attente de reception du pong
                    bytesRead = clientStream.Read(message, 0, 4096);
                    //Reception du message : envoi de la réponse auto
                    byte[] buffer1 = encoder.GetBytes("pause");
                    clientStream.Write(buffer1, 0, buffer1.Length);
                    clientStream.Flush(); 
                }
                catch
                {
                    //socket error
                    //textOut.AppendText(client + " disconnected \r\n");
                    Users--;
                    lblusers.Text = "( Status : " + Computers + " )";
                    break;
                }

                if (bytesRead == 0)
                {
                    //client déconnecté
                    //textOut.AppendText(client + " disconnected \r\n");
                    Users--;
                    lblusers.Text = "( Status : " + Computers + " )";
                    break;
                }

                //reception message ok, connexion réussie
                encoder = new ASCIIEncoding();
                textOut.AppendText(encoder.GetString(message, 0, bytesRead) + "Connected \r\n");
            }

            tcpClient.Close();
        }

        public void SendMessageToAll(string message)
        {
            foreach (?? in ??)
            {
                byte[] buffer1 = encoder.GetBytes(message);
                clientStream.Write(buffer1, 0, buffer1.Length);
                clientStream.Flush();
            }
        }

    }

}



La ou je bloque c'est :

        public void SendMessageToAll(string message)
        {
            foreach (?? in ??)
            {
                byte[] buffer1 = encoder.GetBytes(message);
                clientStream.Write(buffer1, 0, buffer1.Length);
                clientStream.Flush();
            }
        }


Si quelqu'un à un début de réponse ça serait sympa !
Kenavo !
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
36
3
Merci
Salut

Il faudrait que tu sauvegardes la liste de tes TcpClients (que tu remplis juste avant de démarrer ton nouveau thread par exemple.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 88 internautes nous ont dit merci ce mois-ci

Commenter la réponse de krimog
Messages postés
22
Date d'inscription
mercredi 24 octobre 2007
Dernière intervention
1 décembre 2009
0
Merci
Merci bien , j'avais pas pensé à ça !
Commenter la réponse de t0fx

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.