Migrer le code d'un serveur TCP (console) à Service Windows

Résolu
Niiw - 23 mars 2016 à 20:02
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 23 mars 2016 à 22:07
Bonjour à tous.



J'ai développé une application dans ma boîte qui s'inspire du TP "ZCHAT". Enfaite c'est un chat converti en autre chose (à la réception d'un message, le logiciel traite le message et effectue des fonctions spécifiques.

Enfin bref, tout marche nikel ! La seule chose, c'est que mon application serveur est sur le serveur dans ma boîte, et nous avons plusieurs comptes admin pour se connecter au serveur. Donc imaginons la console est lancée sur mon compte, et qu'à un moment je dois fermer ma session, ça va donc fermer la console.. Je voudrais passer cette console en service. Pour qu'il tourne h24.



Voici le code de la console :

Imports System.Net.Sockets
Imports System.Net
Imports System.Threading


Module Module1

    Dim port As String = "8099"
    Dim ListeClients As List(Of Client) 'Liste des clients connectés 
    Dim xList As New ArrayList
    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.Parse("10.103.20.8"), port)

        ListeClients = New List(Of Client) 'Initialise la liste

        MonSocketServeur.Bind(MonEP) 'Lie le socket à cette IP
        MonSocketServeur.Listen(1) 'Se met en écoute

        Console.WriteLine("Socket serveur initialisé sur le port " & port)

        While True 'Boucle à l'infini

            '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)



        Dim NouveauClient As New Client(SocketEnvoi) 'Crée une instance de « client »

        If ListeClients.Contains(NouveauClient) Then
            ListeClients.Remove(NouveauClient) 'Ajoute le client à la liste


        End If

        ListeClients.Add(NouveauClient)

        Console.Write("{0}Nombre de clients connectés : {1}", vbCr, ListeClients.Count.ToString)
        'For i = 0 To ListeClients.Count - 1
        '    Console.WriteLine(xList.Item(i))
        'Next
        '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
        If Not Message = Nothing Then
            Console.WriteLine(vbCrLf & "BROADCAST : " & Message)

            For Each Cli In ListeClients
                Cli.EnvoiMessage(Message)

            Next
        End If




    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()



            '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)
            Catch ex As Exception
                Console.WriteLine("Erreur pendant la réception du pseudo d'un client ... Fermeture du client")
                Return
            End Try

            _Pseudo = System.Text.Encoding.Default.GetString(Bytes)
            _Pseudo = _Pseudo.Substring(0, Recu) 'Retire les caractères inutiles
            xList.Add(_Pseudo)
            While (_SocketClient.Connected)
                Try
                    Dim Message As String
                    Recu = _SocketClient.Receive(Bytes)
                    'Message reçu
                    Message = System.Text.Encoding.Default.GetString(Bytes)
                    Message = Message.Substring(0, Recu) 'Retire les caractères inutiles

                    Broadcast(Message) 'Diffuse le message à tout le monde 


                Catch ex As Exception 'Le client est déconnecté
                    _SocketClient.Close() 'Ferme son socket
                    ListeClients.Remove(Me) 'Le supprime de la liste des clients connectés

                    Console.Write("{0}Nombre de clients connectés : {1}", vbCr, ListeClients.Count.ToString)
                    xList.Remove(_Pseudo)


                    Return 'Fin de la fonction
                End Try
            End While

        End Sub

        Sub EnvoiMessage(ByVal Message As String)
            Dim Mess As Byte() = System.Text.Encoding.Default.GetBytes(Message)
            Dim Envoi As Integer = _SocketClient.Send(Mess)

        End Sub
    End Class

End Module


Le problème c'est la classe Client, qui ne peut pas communiquer avec le sub Main quand je transvase ce code dans un projet "Service Windows"



Une âme charitable pour m'aider ? ^^

1 réponse

Problème résolu :

J'ai juste changé le
Sub Broadcast
en
Shared Sub BroadCast.


Et pareil pour

Dim ListeClients As List(Of Client) 'Liste des clients connectés


je l'ai changé en

Shared ListeClients As List(Of Client) 'Liste des clients connectés



Le tour est joué !

Ca fait des jours que j'essaie de tourner le code dans toutes les manières possibles, et enfin j'ai réussi.

Pourquoi faire simple quand on peut faire compliqué lol.

Imports System.Net.Sockets
Imports System.Net
Imports System.Threading
Public Class Service1
    Dim port As String = "8099"
    Shared ListeClients As List(Of Client) 'Liste des clients connectés 
    Dim listenThread As New Thread(New ThreadStart(AddressOf Mainx))



    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()



            '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)
            Catch ex As Exception
                Console.WriteLine("Erreur pendant la réception du pseudo d'un client ... Fermeture du client")
                Return
            End Try

            _Pseudo = System.Text.Encoding.Default.GetString(Bytes)
            _Pseudo = _Pseudo.Substring(0, Recu) 'Retire les caractères inutiles

            While (_SocketClient.Connected)

                Try

                    Dim Message As String
                    Recu = _SocketClient.Receive(Bytes)
                    'Message reçu
                    Message = System.Text.Encoding.Default.GetString(Bytes)
                    Message = Message.Substring(0, Recu) 'Retire les caractères inutiles



                    Broadcast(Message) 'Diffuse le message à tout le monde 
                Catch ex As Exception 'Le client est déconnecté
                    ListeClients.Remove(Me) 'Le supprime de la liste des clients connectés

                    _SocketClient.Close() 'Ferme son socket

                    Return 'Fin de la fonction
                End Try
            End While

        End Sub

        Sub EnvoiMessage(ByVal Message As String)
            Dim Mess As Byte() = System.Text.Encoding.Default.GetBytes(Message)
            Dim Envoi As Integer = _SocketClient.Send(Mess)

        End Sub
    End Class

    Sub Mainx()

        '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.Parse("10.103.20.8"), port)

        ListeClients = New List(Of Client) 'Initialise la liste

        MonSocketServeur.Bind(MonEP) 'Lie le socket à cette IP
        MonSocketServeur.Listen(1) 'Se met en écoute

        Console.WriteLine("Socket serveur initialisé sur le port " & port)

        While True 'Boucle à l'infini

            '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)



        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

    Shared Sub Broadcast(ByVal Message As String)

        'Écrit le message dans la console et l'envoie à tous les clients connectés
        Console.WriteLine("BROADCAST : " & Message)
        For Each Cli In ListeClients
            Cli.EnvoiMessage(Message)
        Next

    End Sub

    Protected Overrides Sub OnStart(ByVal args() As String)


        listenThread.Start()

    End Sub

    Protected Overrides Sub OnStop()
        listenThread.Abort()
    End Sub

End Class

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
23 mars 2016 à 22:07
Bonsoir,

c'est super d'avoir partagé ta solution.
Afin que la discussion apparaisse résolue, et aide un autre utilisateur à l'avenir, peux tu cliquer sur le lien "Marquer comme résolu", sous le titre de la discussion.

En tant qu'utilisateur non connecté, il est possible que tu ne le voies pas, auquel cas, il faudra faire appel à un modérateur.
0
Rejoignez-nous