IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Préserver l'index d'un objet d'une liste


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Par défaut Préserver l'index d'un objet d'une liste
    Bonjour, je cherche à préserver le numéro d'index d'objets tcpclient d'une liste dynamique.

    En effet, comme je li les données des objets tcpclient via la méthode "read" qui est bloquante, si un objet tcpclient est détruit les numéros d'index (supérieur de l'objet détruit) sont décaler.

    Se qui est normale vu que si il y avais 5 objets et qu'un objet (l'index 1) part, le 5eme objet prend donc la place du 4eme au niveau de l'index.

    Comme vous l'aurez compris ceci pose problème au niveau de la méthode read (bloquante) qui elle, li les données d'un index qui n'as plus le même numéro d'index.

    Si une personne a une idée, merci d'avance car je bloque

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Guyome41 Voir le message
    Comme vous l'aurez compris ceci pose problème au niveau de la méthode read (bloquante) qui elle, li les données d'un index qui n'as plus le même numéro d'index.
    De quelle méthode Read parles-tu ? Et montre ton code, parce que j'ai l'impression que tu t'es un peu emmêlé les pinceaux...

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Par défaut
    Voici comment l'objet est ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     ' -----------------------------------------------------------------------
        ' Thread Attente des nouvelles connexions
        ' -----------------------------------------------------------------------
        Private Sub AttenteConnexion()
     
            While 1
                If objClient.Count < ConnMax.Value Then
                    objClient.Add(objServer.AcceptTcpClient())
                    accepter.Add(False)
                    Pseudo.Add("")
                    addr.Add(objClient(objClient.Count - 1).Client.RemoteEndPoint.ToString.Split(CChar(":"))(0))
                    ThConn.Add(New Threading.Thread(AddressOf GestionConnexion))
     
                    If VerifieClient(objClient.Count - 1) <> 0 Then
                        ThConn(ThConn.Count - 1).Start()
     
                    Else
                        objClient(objClient.Count - 1).Close()
                        objClient.Remove(objClient(objClient.Count - 1))
                        accepter.Remove(objClient.Count - 1)
                        Pseudo.Remove(objClient.Count - 1)
                        addr.Remove(objClient.Count - 1)
                    End If
     
                    ' Sinon, on suppérieur au nombre de connexion MAX on met le thread en pause.
                Else
                    Threading.Thread.Sleep(100)
     
                End If
            End While
        End Sub
    Voici la méthode read (avec la boucle) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
                ' Boucle qui maintient la connexion.
                While accepter(i) = True
                    Read = Stream.Read(bytes, 0, bytes.Length)
                    Recu = Encoding.UTF8.GetString(bytes, 0, Read)
                    Dim Donnees() = Recu.Split(vbCrLf)
     
                    ' Boucle avec decoupage des retours chariots de la données recu.
                    For a As Integer = 0 To Donnees.Count - 2
                        Donnees(a) = Donnees(a).Replace(CChar(ChrW(10)), "")
                        If accepter(i) = True Then GestionDonnees(Donnees(a), i)
                    Next a
                End While
     
                ' Sortie de boucle : le client est déconnecté
                Deconnexion(i)
    EDIT:
    L'objet du thread est repéré avec "i" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim i As Integer = objClient.Count - 1
            Dim Stream As NetworkStream = objClient(i).GetStream
            Dim bytes(objClient(i).ReceiveBufferSize) As Byte

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    OK, j'ai l'impression que tu t'y prends complètement de travers...

    Tu maintiens 4 listes distinctes pour stocker 4 informations sur chacun de tes clients, c'est ingérable... Pourquoi tu ne crées pas une classe Client pour englober les infos de chacun de tes clients connectés ? Comme ça tu aurais juste besoin d'une List(Of Client), et plutôt que de passer un index à toutes tes méthodes, tu passerais une instance de Client. D'ailleurs GestionConnexion pourrait être une méthode d'instance de Client, comme ça elle n'aurait pas du tout à se préoccuper de l'index du client dans la liste...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Class Client
     
        Public Property TcpClient As TcpClient
        Public Property Address As String
        Public Property Pseudo As String
        Public Property Accepter As Boolean
     
        Public Sub GestionConnexion()
            ...
        End Sub
     
    End Class
     
    ...
     
                If objClient.Count < ConnMax.Value Then
                    Dim c As TcpClient = objServer.AcceptTcpClient()
                    Dim cli As New TcpClient With
                    {
                        .TcpClient = c,
                        .Accepter = False,
                        .Pseudo = "",
                        .Address = c.Client.RemoteEndPoint.ToString.Split(CChar(":"))(0))
                    }
                    clients.Add(cli)
                    ThConn.Add(New Threading.Thread(AddressOf cli.GestionConnexion))
                    ...

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Par défaut
    Tu maintiens 4 listes distinctes pour stocker 4 informations sur chacun de tes clients
    Disons que je ne vois pas comment faire autrement étant donné que je doit retrouver les objets clients via un pseudonyme donc j'ai créé des liste "parallèle" pour me repérer avec un index.

    C'est se que j'ai fait pour le même serveur en python (fonctionnel) mais je voudrai le refaire un VB.net.

    Avec t'as méthode je ne vois pas comment repérer un client via un pseudonyme , sont adresse IP ou toute autre informations.

    Edit :
    c'est ingérable...
    Non pas du tous. afin c'est mon avis exemple si un admin veut virer un client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for a = 0 to Pseudo.count - 1
    If pseudo(a) = participant then vire client(a)
    next a
    Ma méthode reste simple pour gérer les connexions ensuite, en cas de déconnexion il me suffi de virer le même index pour que les listes restes bien parallèle.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Guyome41 Voir le message
    Non pas du tous. afin c'est mon avis exemple si un admin veut virer un client :

    for a = 0 to Pseudo.count - 1
    If pseudo(a) = participant then vire client(a)
    next a

    Ma méthode reste simple pour gérer les connexions ensuite, en cas de déconnexion il me suffi de virer le même index pour que les listes restes bien parallèle.
    Je ne pense pas que tu aies compris l'intérêt de la programmation orientée objet... Oui, bien sûr c'est faisable de faire ça avec des listes séparées, mais c'est super galère pour maintenir la cohérence des données. La solution que je te propose est beaucoup plus simple à mon avis...

    Bref, tu fais ce que tu veux, mais si tu tiens à continuer dans cette voie, je ne vois pas de solution simple à ton problème

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/09/2006, 17h21
  2. récupérer un objet dans une liste chainée
    Par marsuwhite dans le forum Langage
    Réponses: 4
    Dernier message: 05/06/2006, 14h05
  3. insertion d'objets dans une liste chainee
    Par mathher dans le forum C++
    Réponses: 8
    Dernier message: 20/04/2006, 16h28
  4. [Swing][JList] Placer un Objet dans une liste
    Par Invité dans le forum Composants
    Réponses: 1
    Dernier message: 17/02/2006, 10h31
  5. Récupérer un objet d'une liste déroulante
    Par Hell dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/01/2005, 14h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo