6 votes

Serveur TCP avec plusieurs clients

Je travaille sur une application serveur/client TCP.

Ma question est :

Mon application serveur démarre un nouveau thread et le bloque jusqu'à ce que la connexion soit acceptée dans la méthode listenforClient

Mais comment puis-je gérer les connexions lorsque plusieurs clients sont connectés à mon serveur et demandent des choses différentes en même temps, comment puis-je faire en sorte que le client 1 reçoive les informations dont il a besoin et la même chose pour le client 2.

C'est multithreadé, donc plusieurs clients peuvent se connecter mais comment puis-je traiter la requête. Je ne veux pas tout mettre dans une seule méthode car cela deviendrait.

Merci d'avance

private void serverstart()
    {
        this.tcplistener = new TcpListener(IPAddress.Any, 49151);
        this.listenThread = new Thread(new ThreadStart(ListenForClients));
        this.listenThread.Start();
    }

    private void ListenForClients()
    {
        this.tcplistener.Start();

        while (true)
        {
            //blocks until a client has connected to the server
            TcpClient client = this.tcplistener.AcceptTcpClient();

            // ici était d'abord un message qui envoie bonjour client
            //
            ///////////////////////////////////////////////////

            //créer un thread pour gérer la communication
            //avec le client connecté
            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));

            clientThread.Start(client);
        }
    }

    private void HandleClientComm(object client)
    {
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();

        byte[] message = new byte[4096];
        int bytesRead;

        while (true)
        {
            bytesRead = 0;

            try
            {
                //bloque jusqu'à ce qu'un client envoie un message
                bytesRead = clientStream.Read(message, 0, 4096);
            }
            catch
            {
                //une erreur de socket s'est produite
                break;
            }

            if (bytesRead == 0)
            {
                //le client s'est déconnecté du serveur
                break;
            }

            //le message a été reçu avec succès
            ASCIIEncoding encoder = new ASCIIEncoding();

            bufferincmessage = encoder.GetString(message, 0, bytesRead);

            if (System.Text.RegularExpressions.Regex.IsMatch(bufferincmessage, Properties.Settings.Default.REQLogin, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
            {
                bufferincmessageresult = bufferincmessage.Split('^');
                nickname_Cl = bufferincmessageresult[1];
                password_Cl = bufferincmessageresult[2];
                getuserdata_db();
                login();

                byte[] buffer = encoder.GetBytes(inlogmessage);

                clientStream.Write(buffer, 0, buffer.Length);
                clientStream.Flush();
            }

        }
    }

5voto

zaynyatyi Points 725

Votre client sera envoyé dans différents threads, donc ils ne se croiseront pas. Il vous suffit d'ajouter quelque chose comme "DispatchMethod" où vos messages seront traités.

using System.Text.RegularExpressions;
...

if (Regex.IsMatch(bufferincmessage, Properties.Settings.Default.REQLogin, RegexOptions.IgnoreCase))
{
    ...
}
else if (Regex.IsMatch(bufferincmessage, /*some of your command1*/, RegexOptions.IgnoreCase))
{
    ...
}
else if (Regex.IsMatch(bufferincmessage, /*some of your command1*/, RegexOptions.IgnoreCase))
{
    ...
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X