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 :

Stream TCP Client


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut Stream TCP Client
    Bonjour,

    Je viens de commencer la création d'un jeu de carte et j'ai une petite question :

    J'ai une fenêtre côté client qui affiche le nombre de joueurs connectés,
    J'ai mon serveur qui compte le nombre de joueur et l'envoie dans le buffer,

    J'aimerai que la fenêtre côté client affiche le nombre de joueurs connectés au serveur, sans avoir à appuyer sur un bouton ou autre déclencheur pour lire le flux de données, j'aimerai que ce soit un flux continu enfaite et qui se ferme (le flux continu pas la connexion car le serveur communique ensuite encore mais je ferai les transmissions sans doute avec des boutons) une fois qu'il y a 4 joueurs de connectés afin d'ouvrir une nouvelle fenêtre ensuite,

    Comment faire ?


    Merci !


    EDIT : peut-être avec beginconnect ? si oui comment procéder ? sachant que j'ai ma connexion stockée dans c_tcpclient (tcpclient.Connect(ip,port))

  2. #2
    Membre averti Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Points : 422
    Points
    422
    Par défaut
    Je comprends pas trop l'intérêt d'envoyer les informations en continu, à part surcharger le serveur.
    Quand le Client se connecte au serveur, laisse le connecter, sert à rien de le déconnecter pour le reconnecter par la suite.
    Pour l'actualisation du nombre de joueur, tu as juste a renvoyer le nombre de joueur connectés lorsqu'un joueur se connecte ou se déconnecte.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut
    Enfaite ça m'intéresse pas spécialement de laisser les informations circuler en continu mais je pensais que c'était cette méthode qu'il fallait que j'applique..

    Par contre je comprends pas comment faire ce que tu me dis, je le met où le code disant au client de faire textbox.text = c_messageduserveur ?
    Parce que si je le met dans une procédure faut bien que j'appelle la procédure quelque part pour faire la vérif :/, ou bien je fais une boucle while qui cherche l'info tant qu'elle n'a pas trouvée mais pareil ça surcharge le serveur je suppose :/

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut
    Autre question, comment envoyer un objet du serveur au client ? Par exemple je voudrai envoyer un tableau de nombre du serveur au client


    Merci

  5. #5
    Membre régulier Avatar de Anklor
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 76
    Points : 120
    Points
    120
    Par défaut
    Il faut utiliser les methodes de "serialization" et "désérialization"

    Tu ajoute <serializable> au dessus de ta classe.
    Fait attention que ta classe soit référencé dans tes 2 projets (Serveur et Client) sinon tu risque d'avoir des soucis.

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut
    Ok merci,

    Et concernant les échanges de données client/serveur ? Je peux pas bien avancer au stade où j'en suis sans savoir comment recevoir les données du serveur sans avoir par ex. à appuyer sur un bouton pour déclencher la lecture des données.

    Merci d'avance

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut
    C'est bon j'ai trouvé...

    Donc un timer pour attendre pour les données,

    et dans ma fonction qui lit le flux que j'avais pris sur un site il y a avait un do loop while dataavailable=true , donc du coup ça laissait jamais la main à l'application d'où le fait que je comprenais pas comment faire...

  8. #8
    Membre averti Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Points : 422
    Points
    422
    Par défaut
    En aucun cas tu n'as besoin de timer, tu traites les données quand elles arrivent.
    Quelle classe et fonctions utilises-tu pour tes connexions sockets afin qu'on te conseille?

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut
    Oki, pour l'instant je continue comme ça alors jusqu'à qu'on trouve la solution

    donc j'ai ma form de démarrage qui contient mon label du nombre de joueurs :

    J'ai mis en commentaire le if vu que ça fonctionne pas...
    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
    Sub New(ByVal p_tcpclient As System.Net.Sockets.TcpClient)
            InitializeComponent()
            c_tcpclient = p_tcpclient
            c_communication_flux = New cls_communication_flux(c_tcpclient)
        End Sub
     
        Private Sub btn_connexion_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_connexion.Click
            btn_connexion.IsEnabled = False
            c_nomjoueur = txt_nomjoueur.Text
            c_communication_flux.EcrireFlux(c_nomjoueur)
            c_idjoueur = c_communication_flux.LireFlux
            'If c_idjoueur = " 4" Then
            c_plateaujeu = New MainWindow(c_tcpclient, c_communication_flux, c_nomjoueur, c_idjoueur)
            Me.Close()
            c_plateaujeu.Visibility = Windows.Visibility.Visible
            'End If
        End Sub

    et la classe qui gère les flux :
    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
     
    Public Class cls_communication_flux
        Dim c_buffer(1024) As Byte
        Dim c_message As StringBuilder = New StringBuilder()
        Private c_tcpclient As TcpClient
        Private c_flux As Net.Sockets.NetworkStream
     
        Sub New(ByVal p_tcpclient As TcpClient)
            c_tcpclient = p_tcpclient
            c_flux = c_tcpclient.GetStream
        End Sub
     
        Function LireFlux() As String
            If c_flux.CanRead Then
                Dim numberOfBytesRead As Integer = 0
                Do
                    numberOfBytesRead = c_flux.Read(c_buffer, 0, c_buffer.Length)
                    c_message.AppendFormat("{0}", Encoding.ASCII.GetString(c_buffer, 0, numberOfBytesRead))
                Loop While c_flux.DataAvailable
                ' Print out the received message to the console.
                Return c_message.ToString()
            Else
                Return "Sorry. You cannot read from this NetworkStream."
            End If
        End Function
     
        Sub EcrireFlux(ByVal p_message As String)
            c_buffer = System.Text.Encoding.ASCII.GetBytes(p_message)
            c_flux.Write(c_buffer, 0, c_buffer.Length)
        End Sub
    End Class
    Donc là j'ai pas encore enlever le do loop while, pas eu le temps de m'en occuper, donc je pense que ça vient des deux méthode lire et écrire car vu que j'y connais pas grand chose...

    Voila, et donc une fois que le client s'est connecté le serveur écrit dans le flux pour dire combien de joueur sont connectés


    Merci d'avance

  10. #10
    Membre régulier Avatar de Anklor
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 76
    Points : 120
    Points
    120
    Par défaut
    Tu devrais utiliser des méthodes asynchrones pour te connecter et lire les données. Sinon ton vas geler ta fenêtre

    pour la connexion :

    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
       Dim MyTcpClient As System.Net.Sockets.TcpClient
       Dim MyNetworkStream As System.Net.Sockets.NetworkStream
     
        Public Sub Connect(ByVal IpAdress As String, ByVal Port As String)
     
            MyTcpClient = New System.Net.Sockets.TcpClient
            MyTcpClient.BeginConnect(IpAdress, Port, New AsyncCallback(AddressOf Event_Connection), Nothing)               
     
        End Sub
     
        Private Sub Event_Connection(ByVal ar As IAsyncResult)
     
        MyNetworkStream = MyTcpClient.GetStream()
     
    ......
     
        End Sub
    presque même principe pour lire les données.

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut
    Ok je vais essayer, cependant si ensuite je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub btn_connexion_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_connexion.Click
          label.content = c_communication_flux.LireFlux
     
        End Sub
    Mon label sera toujours mis à jour (c'est ce que je veux pour qu'il affiche en temps réel le nombre de joueurs) ? Ou
    Le label sera mis à jour UNE FOIS QUE il y aura une donnée de dispo

    Merci

  12. #12
    Membre régulier Avatar de Anklor
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 76
    Points : 120
    Points
    120
    Par défaut
    Essaye de te connecter sur le serveur déjà, parce que là je vois nulle-part que tu te connecte.

  13. #13
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut
    Oki voila le code de connexion :

    Client :
    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
    Private Sub btn_connexionserver_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_connexionserver.Click
            c_tcpclient = New System.Net.Sockets.TcpClient
            c_tcpclient.BeginConnect("127.0.0.1", 43001, New AsyncCallback(AddressOf Event_Connexion), Nothing)
            Do
                If c_tcpclient.Connected = True Then
                    c_flux = c_tcpclient.GetStream
                    c_demarrage = New Demarrage(c_tcpclient, c_flux)
                    'Me.Close()
                    c_demarrage.Visibility = Windows.Visibility.Visible
                End If
            Loop Until c_tcpclient.Connected = True
        End Sub
     
        Private Sub Event_Connexion(ByVal ar As IAsyncResult)
            c_flux = c_tcpclient.GetStream
        End Sub
    Sinon j'ai un problème côté serveur, donc ça se connecte correctement en asynchrone sauf que j'aimerai que le programme laisse ouvert la réception de connexion jusqu'à qu'il y est 4 joueurs de connectés :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    Public Shared tcpClientConnected As New ManualResetEvent(False)
     
        ' Accept one client connection asynchronously.
        Sub DoBeginAcceptTcpClient(ByVal listener As TcpListener)
            ' Set the event to nonsignaled state.
            tcpClientConnected.Reset()
     
            ' Start to listen for connections from a client.
            Console.WriteLine("Waiting for a connection...")
     
            ' Accept the connection. 
            ' BeginAcceptSocket() creates the accepted socket.
            listener.BeginAcceptTcpClient(New AsyncCallback(AddressOf DoAcceptTcpClientCallback), listener)
     
            ' Wait until a connection is made and processed before 
            ' continuing.
            'tcpClientConnected.WaitOne()
        End Sub 'DoBeginAcceptTcpClient
     
     
        ' Process the client connection.
        Sub DoAcceptTcpClientCallback(ByVal ar As IAsyncResult)
            ' Get the listener that handles the client request.
            Dim listener As TcpListener = CType(ar.AsyncState, TcpListener)
            Dim client As TcpClient
     
            ' End the operation and display the received data on 
            ' the console.
     
            client = listener.EndAcceptTcpClient(ar)
     
            If c_nbconnectes = 0 Then
                c_tcpclient1 = client
            End If
            If c_nbconnectes = 1 Then
                c_tcpclient2 = client
            End If
            If c_nbconnectes = 2 Then
                c_tcpclient3 = client
            End If
            If c_nbconnectes = 3 Then
                c_tcpclient4 = client
            End If
     
            c_nbconnectes = c_nbconnectes + 1
            MsgBox("Client " & c_nbconnectes & " connected completed")
            'End If
     
            ' Signal the calling thread to continue.
            'If c_tcpclient1 Is Nothing = False And c_tcpclient2 Is Nothing = False And c_tcpclient3 Is Nothing = False And c_tcpclient4 Is Nothing = False Then
            'tcpClientConnected.Set()
            'End If
     
        End Sub 
     
    Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
      DoBeginAcceptTcpClient(c_tcplistener)
     
        End Sub
    Donc pour résumer la situation actuelle ^^ :
    - j'aimerai savoir comment gérer le fait que mon label soit mis à jour tout seul sans avoir à cliquer sur un bouton
    - j'aimerai que le serveur accepte que les 4 premières connexions
    Si je fais 4 fois :
    DoBeginAcceptTcpClient(c_tcplistener)

    ça fonctionne mais je pense pas que c'est la solution

    Merci

  14. #14
    Membre régulier Avatar de Anklor
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 76
    Points : 120
    Points
    120
    Par défaut
    tu as laissé la méthode synchrone. Dans ton code, tu attends 2 fois la connexion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Private Sub btn_connexionserver_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_connexionserver.Click
            c_tcpclient = New System.Net.Sockets.TcpClient
            c_tcpclient.BeginConnect("127.0.0.1", 43001, New AsyncCallback(AddressOf Event_Connexion), Nothing)
     
        End Sub
     
        Private Sub Event_Connexion(ByVal ar As IAsyncResult)
     
            c_flux = c_tcpclient.GetStream
     
            'là tu mets ton code relatif à la connexion
     
        End Sub

  15. #15
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut
    J'ai pas compris

    côté client :

    tu me dis de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Private Sub btn_connexionserver_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_connexionserver.Click
            c_tcpclient = New System.Net.Sockets.TcpClient
            c_tcpclient.BeginConnect("127.0.0.1", 43001, New AsyncCallback(AddressOf Event_Connexion), Nothing)
     
        End Sub
     
        Private Sub Event_Connexion(ByVal ar As IAsyncResult)
     
            c_flux = c_tcpclient.GetStream
     
            'là tu mets ton code relatif à la connexion
     
        End Sub
    Mais dans mon code tu as juste enlever la boucle je crois, je ne vois pas où il y a deux connexion :/, donc maintenant je pense avoir compris qu'il faut mettre mon code dans le event, j'espère que ça fonctionnera tout ça

    Et pour le serveur une idée ?
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    Public Shared tcpClientConnected As New ManualResetEvent(False)
     
        ' Accept one client connection asynchronously.
        Sub DoBeginAcceptTcpClient(ByVal listener As TcpListener)
            ' Set the event to nonsignaled state.
            tcpClientConnected.Reset()
     
            ' Start to listen for connections from a client.
            Console.WriteLine("Waiting for a connection...")
     
            ' Accept the connection. 
            ' BeginAcceptSocket() creates the accepted socket.
            listener.BeginAcceptTcpClient(New AsyncCallback(AddressOf DoAcceptTcpClientCallback), listener)
     
            ' Wait until a connection is made and processed before 
            ' continuing.
            'tcpClientConnected.WaitOne()
        End Sub 'DoBeginAcceptTcpClient
     
     
        ' Process the client connection.
        Sub DoAcceptTcpClientCallback(ByVal ar As IAsyncResult)
            ' Get the listener that handles the client request.
            Dim listener As TcpListener = CType(ar.AsyncState, TcpListener)
            Dim client As TcpClient
     
            ' End the operation and display the received data on 
            ' the console.
     
            client = listener.EndAcceptTcpClient(ar)
     
            If c_nbconnectes = 0 Then
                c_tcpclient1 = client
            End If
            If c_nbconnectes = 1 Then
                c_tcpclient2 = client
            End If
            If c_nbconnectes = 2 Then
                c_tcpclient3 = client
            End If
            If c_nbconnectes = 3 Then
                c_tcpclient4 = client
            End If
     
            c_nbconnectes = c_nbconnectes + 1
            MsgBox("Client " & c_nbconnectes & " connected completed")
            'End If
     
            ' Signal the calling thread to continue.
            'If c_tcpclient1 Is Nothing = False And c_tcpclient2 Is Nothing = False And c_tcpclient3 Is Nothing = False And c_tcpclient4 Is Nothing = False Then
            'tcpClientConnected.Set()
            'End If
     
        End Sub 
     
    Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
      DoBeginAcceptTcpClient(c_tcplistener)
     
        End Sub
    Merci

    EDIT pour le serveur :
    J'ai ajouter DoBeginAcceptTcpClient(c_tcplistener) dans le DoAcceptTcpClientCallback comme ça il continue d'accepter les connexions, c'est ok de cette façon ? elle fonctionne en tout cas =)

  16. #16
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut
    la connexion semble fonctionner mais si quelqu'un peut me renseigner sur un problème : quand je passe en mode debug (la fenêtre démarrage est appelé lors de la connexion) l'appli plante juste avant le InitializeComponent, d'où ça peut venir ? sachant qu'il y aucune message d'erreur, c'est assez étrange, et les paramètres sont bien passés...


    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
     Private Sub btn_connexion_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_connexion.Click
            c_tcpclient = New System.Net.Sockets.TcpClient
            c_tcpclient.BeginConnect("127.0.0.1", 43001, New AsyncCallback(AddressOf Event_Connexion), Nothing)
            'Do
            '    If c_tcpclient.Connected = True Then
            '        c_flux = c_tcpclient.GetStream
            '        c_demarrage = New Demarrage(c_tcpclient, c_flux)
            '        Me.Close()
            '        c_demarrage.Visibility = Windows.Visibility.Visible
            '    End If
            'Loop Until c_tcpclient.Connected = True
        End Sub
     
        Private Sub Event_Connexion(ByVal ar As IAsyncResult)
            c_flux = c_tcpclient.GetStream
              If c_tcpclient.Connected = True Then
                    c_flux = c_tcpclient.GetStream
                    c_demarrage = New Demarrage(c_tcpclient, c_flux)
                    c_demarrage.Visibility = Windows.Visibility.Visible
                End If
        End Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub New(ByVal p_tcpclient As System.Net.Sockets.TcpClient, ByVal p_flux As System.Net.Sockets.NetworkStream)
            InitializeComponent()
            c_tcpclient = p_tcpclient
            c_flux = p_flux
            'c_communication_flux = New cls_communication_flux(c_tcpclient, c_flux)
        End Sub
    Par contre si je prend le code côté client pour se connecter en synchrone (côté serveur ça reste asynchrone) ça fonctionne normalement, donc qu'est-ce que ça change si je fais de cette manière là ?

    Ensuite, donc comment je ferai pour recevoir les données du getstream.read en continu afin de mettre à jour automatiquement mon label ?

    Désolé je suis chiant ^^ mais vu que j'ai pas réussi a faire ce que je veux encore...

  17. #17
    Membre régulier Avatar de Anklor
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 76
    Points : 120
    Points
    120
    Par défaut
    car tu es dans un autre thread (event_connexion) et que ta classe démarrage doit faire appele à des éléments non créé dans ton thread.
    Utilse try catch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Event_Connexion(ByVal ar As IAsyncResult)
     
        try
            c_flux = c_tcpclient.GetStream
            c_flux = c_tcpclient.GetStream
            c_demarrage = New Demarrage(c_tcpclient, c_flux)
            c_demarrage.Visibility = Windows.Visibility.Visible
        catch ex as exception
            messagebox.show(ex.ToString)
        End Try
     
    End Sub

  18. #18
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut
    Ok voila l'erreur qu'il m'affiche :/ :

    System.InvalidOperationException : Le thread appelant doit être en mode STA, comme l'exigent de nombreux composants de l'interface utilisateur.
    à System.Windows.Input.InputManager.ctor
    à System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
    a System.Windows.FrameworkElement.FrameworkServices.ctor()
    à System.Windows.Controls.Control.ctor()
    à System.Windows.Window..ctor()
    à WPFApllication3.Demarrage..ctpr(mes paramètres) dans C:/...

  19. #19
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Points : 69
    Points
    69
    Par défaut
    Au niveau de la lecture des données j'ai tenté un truc du genre :
    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
     
    Sub LireFlux(ByVal p_flux As NetworkStream)
     
            If p_flux.CanRead Then
     
                Dim myReadBuffer(1024) As Byte
                p_flux.BeginRead(myReadBuffer, 0, myReadBuffer.Length, New AsyncCallback(AddressOf read), p_flux)
                c_fluxgeneral = p_flux
            Else
                Console.WriteLine("Sorry.  You cannot read from this NetworkStream.")
            End If
     
        End Sub
     
        Sub read(ByVal ar As IAsyncResult)
            Dim l_message As StringBuilder = New StringBuilder()
            Dim numberOfBytesRead As Integer = 0
            numberOfBytesRead = c_fluxgeneral.Read(c_buffer, 0, c_buffer.Length)
            l_message.AppendFormat("{0}", Encoding.ASCII.GetString(c_buffer, 0, numberOfBytesRead))
            MsgBox(l_message.ToString)
        End Sub
    Mais fonctionne pas, je dois pas être très loin je pense, mais j'arrive pas à avancer + que ça

Discussions similaires

  1. iptables redirection tcp (client->server)
    Par wosu_ dans le forum Réseau
    Réponses: 2
    Dernier message: 09/01/2009, 13h13
  2. tcp client erreur
    Par kirtap1969 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/08/2008, 20h49
  3. Fichier Corrompu avec TCP Client
    Par Invité dans le forum C#
    Réponses: 2
    Dernier message: 14/05/2008, 16h53
  4. [VB.net] TCP Client, connaitre l'etat de la cnx ?
    Par Olif dans le forum Windows Forms
    Réponses: 14
    Dernier message: 25/09/2007, 22h53
  5. [TCP] Client/Serveur avec les composants Indy
    Par bakaneko dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/02/2007, 12h47

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