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 :

Aide pour migrer code Serveur TCP (console) à Service


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Février 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2015
    Messages : 7
    Par défaut Aide pour migrer code Serveur TCP (console) à Service
    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 :

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    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 ? ^^

  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
    Citation Envoyé par Niiws Voir le message
    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"
    peux tu expliciter ? car ca ne veut pas dire grand chose

    quelques notions de base sur les services windows :
    quand tu créés un projet de type service tu te retrouves avec des overrides de onstart et onstop
    onstart est la 1ère (en fait non mais passons) méthode appelée pour démarrer le service
    tu as peu de temps pour rendre la main sur cette méthode, tu ne peux donc pas y faire de boucle, et pas trop d'init non plus
    il faut que tu démarres un thread, que tu fais pointer sur ta méthode main (à renommer tant qu'à faire), à partir de là ca devrait pouvoir fonctionner pareil (en retirant les console.writeline)

    pour du débuggage tu peux écrire dans un fichier (une service ne pouvant pas afficher quoi que ce soit)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Février 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2015
    Messages : 7
    Par défaut Résolu :D
    Tout d'abord salut à toi, et merci d'avoir pris le temps de me fournir une réponse. Je t'en suis reconnaissant, car j'ai posté sur d'autres forums mais personne n'a répondu.

    Mon seul problème c'était ça

    Nom : s.PNG
Affichages : 93
Taille : 6,5 Ko

    J'ai vu le "non partagé". Donc ce que j'ai fait c'est extrêmement simple. J'ai juste changé le Sub Broadcast en Shared Sub BroadCast.

    Et pareil pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim ListeClients As List(Of Client) 'Liste des clients connectés
    je l'ai changé en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     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.

    Bonne soirée à toi @+

    Pour ce que ça interesse, voici le code final du service :

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    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

  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
    ah oui tu étais sur un module

    un module c'est comme une classe ou tout est shared
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. Aide pour configurer un serveur samba
    Par rigel dans le forum Administration système
    Réponses: 2
    Dernier message: 01/10/2006, 03h29
  2. aide pour un code
    Par foulla002 dans le forum Sécurité
    Réponses: 3
    Dernier message: 03/08/2006, 09h56
  3. aide pour un code
    Par foulla002 dans le forum Langage
    Réponses: 7
    Dernier message: 18/07/2006, 11h04
  4. Aide pour monter un serveur linux
    Par LeYouss dans le forum Réseau
    Réponses: 8
    Dernier message: 05/05/2006, 10h21
  5. aide pour du code svp
    Par rootsngaia dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/04/2006, 23h40

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