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 :

Socket : Serveur et réponse multi clients


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Socket : Serveur et réponse multi clients
    Bonjour

    J'ai un problème assez conséquent sur mon programme Serveur. En effet, je créer un Thread d'écoute à chaque connexion de nouveau client. Voici ce Thread : (allégé au maximum)

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Private Sub start_listen2(ByVal clientNumber As Integer)
     
            Dim cod_char As String
            If (clientNumber = 1) Then
                cod_char = codeChariottextBox.Text
            Else
                cod_char = codeChariottextBox1.Text
            End If
     
            Dim idinstruction as integer
            Dim Reader As OracleDataReader
     
            Do
                Dim Requete As String = ****
                Dim Commande As New OracleCommand(Requete, ConnexionOracle)
     
                Try
                    Reader = Commande.ExecuteReader()
                    While Reader.Read()
                     idinstruction = Reader(0).ToString()
     
                        comandeTab(clientNumber) = Nothing
                        comandeTab(clientNumber) = idinstruction
     
                    End While
                    Reader.Close()
                Catch ex As Exception
                    /
                Finally
                   /
                End Try
     
                SendMsgToClient(comandeTab(clientNumber), clientNumber)
                comandeTab(clientNumber) = Nothing
                While (reponseTab(clientNumber) <> "OK")
                    System.Threading.Thread.Sleep(1)
                End While
                reponseTab(clientNumber) = Nothing
                affichTerm(id)
     
            Loop While (instru <> "FTOUR")
     
        End Sub
    En gros : pour chaque client qui se connecte, il reçoit le premier Id d'une plage qui lui est défini. Le Thread se met en pause tant que je n'ai pas envoyé "OK" de mon client. Une fois que j'envoie "OK" de mon client, mon serveur lui renvoie un nouveau id de la plage et ainsi de suite (voir capture ci dessous)



    Mon soucis : lorsqu'un second client(2 par exemple) se connecte (avec une plage d'ID qui lui est propre) il va en premier lieu recevoir son ID et l'ID en cours de la plage de l'autre client(1). Une fois que j'ai cliqué sur OK, il reçoit bien ses propres ID tant que je clique sur OK. (voir capture ci dessous)



    Si jamais je renvoie Ok avec mon autre client(1), celui-ci va d'abord recevoir le dernier ID envoyé au client 2 puis les bons ID liés au client (1).

    En gros, j'ai un peu l'impression que mon tampon de Reader envoie dans la bonne case du tableau comandeTab(ClientNumber) son ancienne valeur Readé et pas la nouvelle.

    J’espère que c'est assez clair comme description de problème.

    BB59

  2. #2
    Candidat au Club
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    D'après ce que j'ai pu tenter pour résoudre le problème, il s'agirait d'un soucis au niveau du Reader. Il se pourrait donc qu'il y ai confusion entre le thread que je veux utiliser et le thread qui était déjà en cours.

    Pensez vous que c'est possible ?

    Existe-t-il des alternatives à ce dernier ?

    Merci de votre aide en tout cas

  3. #3
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    a mon avis je te propose de lancer des threads séparé pour traiter chaque connexion avec un client de tel sorte que ton lisner se lance et à la réception d'un commande client il lancer un thread pour servir le client et je mis a nouveau en écoute

  4. #4
    Candidat au Club
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je pense que c'est déjà ce que je fais.

    Dès lors que je reçois une commande client, je me remet en écoute afin d'avoir les réponses suivantes.

  5. #5
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      While (reponseTab(clientNumber) <> "OK")
                    System.Threading.Thread.Sleep(1)
                End While
    ce code bloque l’exécution jusque la réception de "ok"?!!

    ce code est pour le deuxième client car je vois que le nom de ta méthode est start_listen2 ?!!

  6. #6
    Candidat au Club
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Du tout, ne pas se fier au nom de mes fonctions.

    Start_listen2 remplace ma start_listen1 tout simplement. C'est mon bout de code qui dit quoi faire lorsque le client m'envoie une donnée.

    J'ai d'autre part une méthode WaitForData qui attend la donnée client et qui apelle une méthode OnDataReceive qui va décrypter ce que client envoie. Une fois que c'est fait, elle rappelle la méthode WaitForData. Elles fonctionnent toutes les deux en asynchrone.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While (reponseTab(clientNumber) <> "OK")
                    System.Threading.Thread.Sleep(1)
                End While
    Oui, ça bloque tant que je n'ai pas reçu de OK dans mon OnDataReceive.

Discussions similaires

  1. Communication Serveur- Multi Client via socket
    Par jesuisperdu dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 14/03/2011, 09h37
  2. Liste chainée, sockets, serveur multi clients.
    Par jbarreau-mainson dans le forum Réseau
    Réponses: 4
    Dernier message: 01/05/2009, 12h15
  3. Probleme Serveur/Multi-client avec socket
    Par CouaC dans le forum Réseau
    Réponses: 9
    Dernier message: 18/06/2007, 00h49
  4. [sockets][UDP][C/C++] serveur multi-clients
    Par l@rry dans le forum Développement
    Réponses: 4
    Dernier message: 08/06/2006, 14h11
  5. [Socket] Comment faire du multi-client ?
    Par eric30eric dans le forum Web & réseau
    Réponses: 5
    Dernier message: 05/01/2005, 21h39

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