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 ? ^^