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 :

Réception en Socket [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 22
    Par défaut Réception en Socket
    Bonjour, je commence à peine a toucher au socket en VB.NET et j'ai deja un soucis lors de la reception de donné sur mon client...
    J'aimerais savoir pourquoi mon programme "bloque", c'est a dire qu'il freeze sans rien qu'il ne se passe :

    Je me connecte au serveur, en envoyant un tableau de byte. Le serveur me repond, mais mon client ne me l'affiche pas :

    La connexion : c'est OK
    l'envoie du tableau : c'est OK
    La reception & affiche : PAS OK

    Je suppose que le problème se situe au niveau de la boucle. Ayant déjà programmé en JAVA du socket, je vois que ça fonctionne différemment en VB.Net
    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
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
     
     
            Try
                MonSocketClient.Connect(MonEP)
            Catch ex As Exception
                MsgBox("Impossible de se connecter !!!")
            End Try
     
            Log.Text = Log.Text + vbCrLf + "Connecté !" + vbCrLf
            PaquetEnvoye(0) = 2
            PaquetEnvoye(1) = &HD9
            PaquetEnvoye(2) = 1
            PaquetEnvoye(3) = 1
     
     
            MonSocketClient.Send(PaquetEnvoye)
            Log.Text = Log.Text + "Paquet Envoyer : " + lireTab(PaquetEnvoye) + vbCrLf
     
            While MonSocketClient.Connected
                MonSocketClient.Receive(PaquetRecu)
     
                Log.Text = Log.Text + "Paquet reçu : " + lireTab(PaquetRecu) + vbCrLf
            End While


    Alors qu'en enlevant la boucle et en répétant 5 fois ma ligne de code, j'arrive à recevoir mes 5 PAQUETS envoyé du serveur et donc à afficher son contenu dans ma Textbox, en lisant le PaquetRecu

    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
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
     
     
            Try
                MonSocketClient.Connect(MonEP)
            Catch ex As Exception
                MsgBox("Impossible de se connecter !!!")
            End Try
     
            Log.Text = Log.Text + vbCrLf + "Connecté !" + vbCrLf
            PaquetEnvoye(0) = 2
            PaquetEnvoye(1) = &HD9
            PaquetEnvoye(2) = 1
            PaquetEnvoye(3) = 1
     
     
            MonSocketClient.Send(PaquetEnvoye)
            Log.Text = Log.Text + "Paquet Envoyer : " + lireTab(PaquetEnvoye) + vbCrLf
     
     
                MonSocketClient.Receive(PaquetRecu)
                Log.Text = Log.Text + "Paquet reçu : " + lireTab(PaquetRecu) + vbCrLf
     
                MonSocketClient.Receive(PaquetRecu)
                Log.Text = Log.Text + "Paquet reçu : " + lireTab(PaquetRecu) + vbCrLf
     
                MonSocketClient.Receive(PaquetRecu)
                Log.Text = Log.Text + "Paquet reçu : " + lireTab(PaquetRecu) + vbCrLf
     
                MonSocketClient.Receive(PaquetRecu)
                Log.Text = Log.Text + "Paquet reçu : " + lireTab(PaquetRecu) + vbCrLf
            e
    J'ai peut-etre une idée, de creer un thread qui lance la boucle while ?
    Merci de votre aide les boys !

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    la méthode receive est une méthode bloquante = tant que ca ne recoit rien ca attend
    or l'interface est rafraichit par le même thread que celui dans lequel ton code s'exécute (d'où le freeze)

    tu peux donc créer un nouveau thread pour faire ta boucle (même code à priori), ou alors utiliser les méthodes asynchrones

    les méthodes asynchrones sont non bloquantes (= ca passe à la ligne d'après tout de suite) et appellent un callback quand une réception arrive
    ca fait une sorte d'évènement
    les méthodes asynchrones commencent par begin, comme .beginreceive (.beginconnect, .beginsend ...)
    le callback c'est un adressof une sub à donner en paramètre, et dans cette méthode, il faut :
    - appeler .endreceive
    - faire la lecture des données (j'ai plus la syntaxe en tête) (si le nombre d'octets lus = 0 ca veut dire déconnexion de l'autre côté)
    - refaire une demande .beginreceive pointant vers la même sub (ce qui fait l'équivalent d'une boucle au final)

    attention : depuis un autre thread que le thread principal on ne peut pas modifier l'interface (cross thread exception)
    il faut alors passer par un invoke (ou utiliser des variables et un timer qui lui sera sur le thread principal)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 22
    Par défaut
    Alors effectivement utilsier un thread etait une bonne idée, et comme tu l'a préciser, mon second thread ne pourra pas modifier les Form de mon main. Il faut passer par un delegate ! Donc j'ai finalement reussi avec la methode thread & receive.

    J'essayerais plus tard pour la methode BeginReceive .

    Merci de ta réponse, je fourni tout de meme mon code , pour les prochaines personne qui connaitront le problème !

    Premièrement on déclare notre Thread et notre delegate :
    -LirePaquet sera la fonction que mon thread executera

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim MonThread As New Thread(AddressOf LirePaquet)
    Delegate Sub dReception()
    Ensuite à l'evenement CLICK de mon bouton connexion , je lance le thread qui recevra les donnée
    Je definie ma fonction LirePaquet :

    On lance une boucle infinie qui verifie tout d'abord si le client est connecté. S'il ne l'est pas, on re-verifie infiniement jusqu'a qu'il soit connecté. Une fois connecté, on recoit le Paquet et on invoke le delegate pour modifier mon journal (la ou apparaitra les donné du paquet) grace à la funtion MajBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Public Function LirePaquet()
            While True
                While MonSocketClient.Connected
                    Try
                        MonSocketClient.Receive(PaquetRecu)
                        Me.Invoke(New dReception(AddressOf MajBox))
                    Catch ex As Exception
    Console.writeline("error")
                    End Try
                End While
            End While
        End Function

    et on definie Majbox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub MajBox()
            Log.Text = Log.Text + "Paquet reçu : " + lireTab(PaquetRecu) + vbCrLf
        End Sub
    Tadammmm , ça fonctionne !

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    Citation Envoyé par zozimama Voir le message
    je fourni tout de meme mon code
    c'est gentil, mais les gens préfèreront surement poster une question plutot que de chercher une existante
    (preuve en est que ce n'est surement pas la 1ère fois qu'on répond à cette question )

    de plus les delegate c'est so 2008 !
    de nos jours on s'en passe (le principe reste le même, juste la syntaxe change, avec un addressof ou une méthode anonyme)

    ton try catch je l'aurais mis un cran au dessus aussi (et idéalement il faudrait du code de reconnexion)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. Problème réception avec socket
    Par toufik135 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 10/01/2014, 09h40
  2. Réception fichier Socket
    Par Ywnith dans le forum C#
    Réponses: 14
    Dernier message: 07/11/2013, 22h49
  3. Réceptions Messages Socket
    Par aldagon72 dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 23/03/2012, 03h26
  4. Accusé de réception serveur socket
    Par juju1988 dans le forum Débuter
    Réponses: 12
    Dernier message: 14/03/2012, 16h32
  5. Problème de réception dans Socket.
    Par rzayani dans le forum C++
    Réponses: 0
    Dernier message: 29/04/2008, 15h49

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