Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème TCP-SERVER

    12 juillet 2019 à 11:53:56

    Bonjour à tous,

    J'ai suivi le cours de VB.net sur OpenClassrooms et j'ai essayé d'effectuer quelques modifications sur le programme de communication entre Client et serveur TCP.

    J'ai voulu rajouter une interface au serveur, le problème c'est que ça ne fonctionne pas très bien. En effet lorsque je lance l'application, la fenêtre s'ouvre :

     

    Lorsque j'appuie sur START-LISTENING, la fenêtre de répond plus, rien ne s'affiche dans la LISTBOX.

    Par contre les clients arrivent bien à se connecter sur le serveur. Mais la fenêtre du serveur ne répond plus et aucun message ne s'affiche.

    Je ne comprends pas pourquoi rien ne s'affiche dans le LISTBOX.

    Voici le code coté serveur :

    Imports System.Net.Sockets
    Imports System.Net
    Imports System.Threading
    
    Public Class Server
    
        Public port As String = "8080"
        Dim ListeClients As List(Of Client) 'Liste destinée à contenir les clients connectés
    
        Public Sub Main()
    
            'Crée le socket et l'IP EP
            Dim MonSocketServeur As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            Dim MonEP As IPEndPoint = New IPEndPoint(IPAddress.Any, port)
    
            ListeClients = New List(Of Client) 'Initialise la liste
    
            MonSocketServeur.Bind(MonEP) 'Lie le socket à cette IP
            MonSocketServeur.Listen(1) 'Se met en écoute
    
            Form1.LB_MESS.Items.Add("Socket serveur initialisé sur le port " & port)
    
            While True 'Boucle à l'infini
                Form1.LB_MESS.Items.Add("En attente d'un client.")
                'Se met en attente de connexion et appelle TraitementConnexion() lors d'une connexion.
                Dim SocketEnvoi As Socket = MonSocketServeur.Accept() 'Bloquant tant que pas de connexion
                TraitementConnexion(SocketEnvoi) 'Traite la connexion du client
            End While
    
        End Sub
    
        Sub TraitementConnexion(ByVal SocketEnvoi As Socket)
    
            Form1.LB_MESS.Items.Add("Socket client connecté, création d'un thread.")
    
            Dim NouveauClient As New Client(SocketEnvoi) 'Crée une instance de « client »
            ListeClients.Add(NouveauClient) 'Ajoute le client à la liste
    
            'Crée un thread pour traiter ce client et le démarre
            Dim ThreadClient As New Thread(AddressOf NouveauClient.TraitementClient)
            ThreadClient.Start()
        End Sub
    
        Sub Broadcast(ByVal Message As String)
    
            'Écrit le message dans la console et l'envoie à tous les clients connectés
            Form1.LB_MESS.Items.Add("BROADCAST : " & Message)
            For Each Cli In ListeClients
                Cli.EnvoiMessage(Message)
            Next
    
        End Sub
    
        Private Class Client
            Private _SocketClient As Socket 'Le socket du client
            Private _Pseudo As String 'Le pseudo du client
    
            'Constructeur
            Sub New(ByVal Sock As Socket)
                _SocketClient = Sock
            End Sub
    
            Sub TraitementClient()
    
                Dim Serv = New Server()
    
                Form1.LB_MESS.Items.Add("Thread client lancé. ")
    
                'Le client vient de se connecter
                Dim Bytes(255) As Byte 'Tableau de 255 : on ne reçoit que 255 caractères au maximum
                'Réception du premier message contenant le pseudo
                Dim Recu As Integer
                Try
                    Recu = _SocketClient.Receive(Bytes) 'Reçoit les premières données : le pseudo
                Catch ex As Exception
                    Form1.LB_MESS.Items.Add("Erreur pendant la réception du pseudo d'un client ... Fermeture du client")
                    Return
                End Try
    
                _Pseudo = System.Text.Encoding.UTF8.GetString(Bytes)
                _Pseudo = _Pseudo.Substring(0, Recu) 'Retire les caractères inutiles
    
                Serv.Broadcast(_Pseudo & " identifié sur le chat") 'Diffuse le message à tout le monde 
                While (_SocketClient.Connected)
                    Try
                        Dim Message As String
                        Recu = _SocketClient.Receive(Bytes)
                        'Message reçu
                        Message = System.Text.Encoding.UTF8.GetString(Bytes)
                        Message = Message.Substring(0, Recu) 'Retire les caractères inutiles
                        Serv.Broadcast(_Pseudo & " dit : " & Message) 'Diffuse le message à tout le monde 
                    Catch ex As Exception 'Le client est déconnecté
                        Serv.ListeClients.Remove(Me) 'Le supprime de la liste des clients connectés
                        _SocketClient.Close() 'Ferme son socket
                        Serv.Broadcast(_Pseudo & " déconnecté.") 'Diffuse le message à tout le monde 
                        Return 'Fin de la fonction
                    End Try
                End While
    
            End Sub
    
            Sub EnvoiMessage(ByVal Message As String)
                Dim Mess As Byte() = System.Text.Encoding.UTF8.GetBytes(Message)
                Dim Envoi As Integer = _SocketClient.Send(Mess)
                Form1.LB_MESS.Items.Add(Envoi & " bytes envoyés au client " & _Pseudo)
            End Sub
        End Class
    
    End Class

    Voici le code coté Design :

    Imports System.Net.Sockets
    
    Public Class Form1
    
        Dim AccessServer As New Server
    
        Private Sub BTN_SL_Click(sender As Object, e As EventArgs) Handles BTN_SL.Click
            AccessServer.Main()
        End Sub
    
        Private Sub BTN_DC_Click(sender As Object, e As EventArgs) Handles BTN_DC.Click
    
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim strHostName As String
            Dim strIPAddress As String
    
            strHostName = System.Net.Dns.GetHostName()
            strIPAddress = System.Net.Dns.GetHostByName(strHostName).AddressList(0).ToString
    
            TXT_IP.Text = strIPAddress
            TXT_PORT.Text = AccessServer.port
    
        End Sub
    End Class
    

    La solution du projet : 

    Je vous remercie d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      16 juillet 2019 à 14:49:23

      Bonjour à tous,

      J'ai trouvé le problème.

      En revanche si vous pouvez m'apporter une aide sur celui-ci ? lol :)

      J'ai crée un bouton dans la fenêtre du serveur qui permet de déconnecter tout les clients connectés au serveur. Sauf que cela ne fonctionne pas, les clients peuvent toujours communiqué entre eux.... avez vous des explications ?

      Private Sub BTN_DC_Click(sender As Object, e As EventArgs) Handles BTN_DC.Click
              Dim Time_cl As Integer = 0
      
              Broadcast("Fermeture des connexion clients")
              MonSocketServeur.Close()

      Code Module :

       Public port As String = "8080"
          Dim ListeClients As List(Of Client) 'Liste destinée à contenir les clients connectés
          Public prompt As New clsFormControls
          Public MonSocketServeur As Socket
          Public ThreadListening As Thread
      
          Sub Main()
      
              'Crée le socket et l'IP EP
              MonSocketServeur = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
              Dim MonEP As IPEndPoint = New IPEndPoint(IPAddress.Any, port)
      
              ListeClients = New List(Of Client) 'Initialise la liste
      
              MonSocketServeur.Bind(MonEP) 'Lie le socket à cette IP
              MonSocketServeur.Listen(1) 'Se met en écoute
      
              Form1.LB_MESS.Items.Add("Socket serveur initialisé sur le port " & port)
      
              ThreadListening = New Thread(AddressOf TraitementListening)
              ThreadListening.Start(MonSocketServeur)
      
          End Sub
      
          Sub TraitementListening(ByVal MonSocketServeur As Socket)
      
              prompt.setPrompt("En attente d'un client")
      
              While True 'Boucle à l'infini
      
                  Try
                      'Se met en attente de connexion et appelle TraitementConnexion() lors d'une connexion.
                      Dim SocketEnvoi As Socket = MonSocketServeur.Accept() 'Bloquant tant que pas de connexion
                      TraitementConnexion(SocketEnvoi) 'Traite la connexion du client
                  Catch ex As System.Net.Sockets.SocketException
                      ThreadListening.Abort()
                  End Try
      
              End While
      
          End Sub

      Je vous remercie

      • Partager sur Facebook
      • Partager sur Twitter
        27 août 2019 à 14:42:00

        Bon, vous "utilisez", sans vous en rendre compte je pense, une fonctionnalité toute pourrie de VB.NET récupéré tout droit d'une cochonnerie de VBx du millénaire antérieur.

        Votre "Form1", dans votre code, c'est un champ statique tout pété pour cacher maladroitement les concepts Objet à l'utilisateur VB "moyen", sensément peu versé dans la conception Objet.

        En cachant ce qu'est vraiment une classe et une instance de classe vous vous retrouvez complètement dans le décor.

        Votre méthode "Main", est un "Main" pour une application console, qui n'est pas fait pour gérer une IHM.

        Votre "boucle active" (BEURK!!!) ne fait qu'écouter la socket de connexion du serveur, donc interdisant par ce fait toute gestion de l'IHM qui elle a besoin d'avoir du CPU de temps en temps.

        La dernière version de votre code qui déporte la boucle active dans un thread auxiliaire ne fait que complexifier inutilement le problème.

        Le plus simple, c'est de commencer par utiliser un type de projet VS adapté à votre solution logicielle et de faire un truc simple dans le code du formulaire et de ne rien ajouter dans la méthode "Main" créé par VS.

        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

        Problème TCP-SERVER

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown