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 :
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"
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
Une âme charitable pour m'aider ? ^^
Partager