Niiw
-
23 mars 2016 à 20:02
Whismeril
Messages postés18605Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention23 septembre 2023
-
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 ? ^^
A voir également:
Migrer le code d'un serveur TCP (console) à Service Windows
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
Whismeril
Messages postés18605Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention23 septembre 2023628 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.
23 mars 2016 à 22:07
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.